假设我有一个名为 text.txt 的文件在text.txt中,我有一些以下模式:
/**
* @something
**/
我想将此模式替换为空字符串。执行此操作最简单的 Linux 命令是什么?
- “grep”不起作用,因为这是多行模式。
- 我尝试了“sed”,但无法正常工作。
- 我想“awk”可能很容易,但是“awk”看起来很复杂,而且我对“awk”不熟悉。
假设我们的输入文件是:
$ cat text.txt
before
/**
* @something
**/
after
我们可以使用awk
过滤掉注释:
$ awk '/\/\*\*/ {c=1; next} /\*\*\// {c=0; next} c==0 {print}' text.txt
before
after
awk
的工作原理是使用一个名为 c
的变量作为标志。当我们开始时,c=0
表明我们不在评论中。当出现注释开始行 /**
时,我们设置 c=1
。 c
保持为 1,直到出现下一个注释结束行 **/
,在这种情况下,c
将设置回 0。仅当 c=0
时才会打印该行。不打印打开和关闭注释行之间的任何内容,无论格式如何。
该代码看起来很有趣,因为 /
和 *
都是 awk
的事件字符。所以,他们都需要通过反弹来逃脱。因此,例如,查找注释开始行的正则表达式类似于 \/\*\*
,而查找注释结束行的正则表达式类似于 \*\*\/
。
更复杂的输入文件
假设输入文件具有更复杂的结构,如 JS 示例所示:
$ cat file
something
/**
* @something
**/ random
hello
hi /**
* @something
**/ bye
hola
gracias
bye
我们可以使用 awk
处理这个问题,如下所示:
$ awk -v RS='\\*\\*/\n*' '{sub(/\n*\/\*\*.*/,"",$0); print $0}' file
something
random
hello
hi
bye
hola
gracias
bye
以上内容已使用 GNU awk
进行了测试。由于它使用多字符记录分隔符,因此它可能不适用于旧版本的 awk
。
虽然awk
通常逐行读取文件,但在上面的版本中,我们设置了记录分隔符RS
来匹配注释的结尾。然后,我们删除从评论开始到记录结尾的所有内容并打印记录。
我是一名优秀的程序员,十分优秀!