Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用反向引用的多行sed_Regex_Sed - Fatal编程技术网

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;}'