首页 > 解决方案 > 如何删除文件开头的两个匹配字符串(仅第一次出现)之间的文本?

问题描述

我正在尝试删除文件开头之间/*的文本。*/可以有white spacesnew lines (\n)之前或之间/**/

我尝试了以下操作,但在有空格或换行时不起作用。

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

示例文件:

   /*******
delete
bla

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

预期输出:

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

标签: shellawk

解决方案


在每个 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
****/

有关这些 gsub() 正在做什么的说明,请参阅https://stackoverflow.com/a/56658441/1745001 。


推荐阅读