跨行匹配模式

时间:2019-01-21 09:07:03

标签: sed

假设我有一个文件,其中包含:

something  
line=1  
file=2  
other  
lines  
ignore  

something  
line=2  
file=3  
other  
lines  
ignore  

最终,我希望每个部分都有唯一的行和文件组合列表。在第一阶段,我试图让sed仅输出合并为一行的那些行,例如

line=1file=2  
line=2file=3

然后我可以使用sortuniq

所以我正在尝试

sed -n -r 's/(line=)(.*?)(\r)(file=)(.*?)(\r)/\1\2\4\5/p' sample.txt

(不一定只是后面的数字)

但是它不会完全匹配。我已经尝试过\ n和\ r \ n,但是它似乎不是换行符,因为:

sed -n -r 's/(line=)(.*?)(\r)/\1\2/p' sample.txt

将输出“ line =”行,但我只是无法使它跨越新行,也无法收集第二行。

1 个答案:

答案 0 :(得分:0)

默认情况下,sed仅对由\n字符分隔的块起作用,因此您永远都不能跨多行进行匹配。某些sed实现支持-z选项,这将使其可以在用ASCII NUL字符而不是换行符分隔的块上进行操作(这可能适用于小型文件,假设NUL字符不会影响所需的模式)匹配)

还有一些sed命令可用于多行处理

sed -n '/line=/{N;s/\n//p}'
  • N命令将下一行添加到当前正在处理的块中(在这种情况下,该块必须与line=匹配)
  • s/\n//p然后删除换行符,以便将输出作为单行显示

如果您输入的内容具有dos样式行的结尾,请先将其转换为unix样式(请参见https://docs.docker.com/compose/compose-file/#external-1)或也要注意\r

sed -n '/line=/{N;s/\r\n//p}'

请注意,这些命令已在GNU sed上进行了测试,语法可能会因其他实现而有所不同