Regex 使用反向引用的多行sed
我正在使用命令行脚本转换修补程序脚本-在这些脚本中,有两行代码的组合,如:Regex 使用反向引用的多行sed,regex,sed,Regex,Sed,我正在使用命令行脚本转换修补程序脚本-在这些脚本中,有两行代码的组合,如: --- /dev/null +++ filename.txt 需要转换为: --- filename.txt +++ filename.txt 最初我尝试: less file.diff | sed -e "s/---\/dev\null\n+++ \(.*\)/--- \1\n+++ \1/" 但我必须发现,在sed中,多行处理要复杂得多:( 非常感谢您的帮助…您可以跳过sed并在一个子shell中串接两个命令:
--- /dev/null
+++ filename.txt
需要转换为:
--- filename.txt
+++ filename.txt
最初我尝试:
less file.diff | sed -e "s/---\/dev\null\n+++ \(.*\)/--- \1\n+++ \1/"
但我必须发现,在sed中,多行处理要复杂得多:(
非常感谢您的帮助…您可以跳过sed并在一个子shell中串接两个命令:
(read; read x FILE; echo "--- $FILE"; echo "+++ $FILE"; cat) < file.diff
我想这两种方法的共同点是,只需自己打印出第一行,而不是试图返回并对其执行搜索/替换。谢谢-事实上,这就是我想到的:
sed -e "N; s/.*null\n+++ \(.*\)/--- \1\n+++ \1/" filename.txt
基本上(如果我没有弄错的话)开始时的N只是告诉sed合并两行,并使用两行而不是一行来启用比较-其他所有内容都是纯正则表达式…您还可以首先将整个文件放入保留缓冲区,然后将保留缓冲区复制到模式缓冲区,并对整个文件应用regexp(将换行符与\n匹配) 看起来像这样:
sed -n '1h;1!H;${;g;s/a/b/g;p;}'
一些解释:
- 1h-如果是第一行,则将第一份副本复制到 缓冲区
- 1!H-如果不是第一行,则将(H)附加到保持缓冲区
- ${…}-如果最后一行是
- ;g;s/a/b/g;p;-g copy保存到模式缓冲区,s/a/b/g执行正则表达式匹配(在本例中,将“a”替换为“b”),p打印结果
sed -n '1h;1!H;${;g;s/a/b/g;p;}'