如何删除文件开头的两个匹配字符串(包括第一次出现的字符串)之间的文本



我正在尝试删除位于文件开头的/**/之间的文本。在CCD_ 5和CCD_ 6之前或之间可以有CCD_ 3或CCD_。

我试着跟随,但当有空位或新行时就不起作用了。

sed '/^/*/,/*//d' file

示例文件:

/*******
delete
bla
***
*/
/* do not */
print "hi"
/*******
dont delete
****/

预期输出:

/* do not */
print "hi"
/*******
dont delete
****/

如果ed可用。

printf '%sn' '/^[[:space:]]*//;/^[[:space:]]**//d' ,p Q | ed -s file.txt
  • Q更改为w以编辑文件

在每个UNIX盒子上的任何shell中使用任何awk,这将从您提供的输入中产生您想要的输出:

$ awk 'f; /*//{f=1}' file
/* do not */
print "hi"
/*******
dont delete
****/

但也可以考虑这种更通用的方法:

$ cat tst.awk
{ rec = (NR>1 ? rec ORS : "") $0 }
END {
$0 = rec
gsub(/@/,"@A"); gsub(/{/,"@B"); gsub(/}/,"@C")
gsub(//*/,"{"); gsub(/*//,"}")
sub(/^[[:space:]]*{[^}]*}[[:blank:]]*n/,"")
gsub(/}/,"*/"); gsub(/{/,"/*")
gsub(/@C/,"}"); gsub(/@B/,"{"); gsub(/@A/,"@")
print
}

$ awk -f tst.awk file
/* do not */
print "hi"
/*******
dont delete
****/

请参阅https://stackoverflow.com/a/56658441/1745001来解释那些gsub((正在做什么。

awk 'BEGIN{f=-1} /^ */*+/{f++}f' file

/* do not */
print "hi"
/*******
dont delete
****/

相关内容

最新更新