假设我有一个文件,其中包含:
something
line=1
file=2
other
lines
ignore
something
line=2
file=3
other
lines
ignore
最终,我希望每个部分都有唯一的行和文件组合列表。在第一阶段,我试图让sed
仅输出合并为一行的那些行,例如
line=1file=2
line=2file=3
然后我可以使用sort
和uniq
。
所以我正在尝试
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 =”行,但我只是无法使它跨越新行,也无法收集第二行。
答案 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
上进行了测试,语法可能会因其他实现而有所不同