regex - 如何在 GNU awk 中设置多字符记录分隔符 RS 使其包含新行?

标签 regex awk

我正在使用 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/

相关文章:

javascript 使用正则表达式分割字符串

linux - 如何通过将 Grep 输出管道传输到 Sed 来添加变量模式?

bash - 从 linux 中的循环中的字符串中提取特定字符

bash - 如何在bash中更新文件中的多字符分隔字段?

bash - 将文件拆分为多个文件(按列)

Java 正则表达式 : Evaluate a string against a particular pattern

python - 什么正则表达式会模拟 python 中 split() 的默认行为?

MySQL - 如何连接至少包含一个字母字符的列

php - 使用Open Graph协议(protocol)提取og :image source

for-loop - 使用 awk 每隔一个字段打印一次