我正在使用 GNU Awk 4.1.3。我想处理这个文件:
$$$$
1
1
$$$$
2
2
$$$$
3
3
$$$$
1
clave
2
$$$$
5
5
$$$$
当给定的块中包含文本“clave”时,打印“$$$$”和下一个“$$$$”之间的行块。也就是说,对于给定的示例,我想要这个输出:1
clave
2
我的解决方案是设置record separator RS
到字符串“$$$$”。由于它是一个特殊字符,我需要对其进行转义,所以它最终就像 RS='\\$\\$\\$\\$'
:awk -v RS='\\$\\$\\$\\$' '/clave/' file
这样做的问题是结果在块之前和之后包含一个新行:$ awk -v RS='\\$\\$\\$\\$' '/clave/' file
1
clave
2
这是因为“$$$$”的结尾和“1”之间有一个新行,“2”和下一个“$$$$”之间也有一个新行。为了避免这种情况,我在记录分隔符的两端添加了新行,所以它变成了
RS='\n\$\$\$\$\n'
.它运作良好:$ awk -v RS='\n\\$\\$\\$\\$\n' '/clave/' file
# ^^^ ^^
1
clave
2
但是,这变得非常复杂,我想知道在记录分隔符中包含新行是否会产生一些我不知道的副作用。为此,我想知道:如何设置记录分隔符以使其包含新行?我的方法是否有效,还是应该因为我的方法有一些缺点而选择其他选择?
最佳答案
您应该在 4 $
前后匹配换行符s 因为那是真正的分隔符(一串 4 $
在它自己的一行上),如果 4 $
其他任何事情都可能失败s 出现在您的数据中。 $
的第一针s 当然之前不会有换行符,它将匹配字符串开始指示符( ^
),因此您需要使用:
$ awk -v RS='(^|\n)[$]{4}\n' '/clave/' file
1
clave
2
我找到 [$]
比 \\$
更容易阅读, YMMV。
关于regex - 如何在 GNU awk 中设置多字符记录分隔符 RS 使其包含新行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64890507/