我正在使用 GNU Awk 4.1.3。我想处理这个文件:
$$$$
1
1
$$$$
2
2
$$$$
3
3
$$$$
1
clave
2
$$$$
5
5
$$$$
Run Code Online (Sandbox Code Playgroud)
当给定的块中包含文本“clave”时,打印“$$$$”和下一个“$$$$”之间的行块。也就是说,对于给定的示例,我想要这个输出:
1
clave
2
Run Code Online (Sandbox Code Playgroud)
我的解决方案是将记录分隔符RS设置为字符串“$$$$”。由于它是一个特殊字符,我需要对其进行转义,因此它最终类似于RS='\\$\\$\\$\\$':
awk -v RS='\\$\\$\\$\\$' '/clave/' file
Run Code Online (Sandbox Code Playgroud)
这样做的问题是结果在块之前和之后包含一个新行:
$ awk -v RS='\\$\\$\\$\\$' '/clave/' file
1
clave
2
Run Code Online (Sandbox Code Playgroud)
这是因为“$$$$”的结尾和“1”之间有一个新行,而“2”和下一个“$$$$”之间也有一个新行。
为了避免这种情况,我在记录分隔符的两端添加了新行,所以它变成了. 它运作良好:RS='\n\$\$\$\$\n'
$$$$
1
1
$$$$
2
2
$$$$
3
3
$$$$
1
clave
2
$$$$
5
5
$$$$
Run Code Online (Sandbox Code Playgroud)
但是,这变得非常复杂,我想知道在记录分隔符中包含新行是否会产生一些我不知道的副作用。
为此,我想知道:如何设置记录分隔符以使其包含新行?我的方法是否有效,还是应该因为我的方法有一些缺点而选择其他选择?