找到两行并替换为一行

时间:2017-06-14 19:44:15

标签: linux sed

我正在寻找一种解决方案,可以让我在linux服务器上搜索看起来像文件的文本文件并找到如下模式:

Text 123
Blue Green

每次在文件中找到它时,用一行替换它......

Order Blue Green

我不确定解决这个问题的最简单方法是什么。我见过许多使用SED的指南,但仅用于查找一行并替换它。

2 个答案:

答案 0 :(得分:1)

你问sed,这是sed的答案 但是,让我提一下,虽然sed对于这种运动很有趣,但你可能应该选择其他的东西,更灵活,更容易学习;以perl为例。

  • 寻找第一行/Text 123/
  • 找到后开始循环:a
    • concat next line N
    • 用单一副本替换搜索文本的双胞胎并打印出来 s/Text 123\nText 123/Text 123/p;
    • 循环,而替换ta;
  • 尝试替换s///
  • 如果替换不触发,
  • 依赖于concat被打印不变

代码:

sed "/Text 123/{:a;N;s/Text 123\nText 123/Text 123/p;ta;s/Text 123\nBlue Green/Order Blue Green/}"

测试输入:

Text 123
Do not replace
Lala
Text 123
Blue Green
lulu
Text 123
Do not replace either
Text 123
Text 123
Blue Green
preceding should be replaced

输出:

Text 123
Do not replace
Lala
Order Blue Green
lulu
Text 123
Do not replace either
Text 123
Order Blue Green
preceding should be replaced

平台:Windows和GNU sed版本4.2.1

注意: 在该平台上,sed行允许使用两个文本片段的环境变量,您可能想要这样做:

sed "/%EnvVar2%/{:a;N;s/%EnvVar2%\n%EnvVar2%/%EnvVar2%/p;ta;s/%EnvVar2%\n%EnvVar%/Order %EnvVar%/}"

PLATFORM2:
仍然是Windows
使用bash GNU bash,版本3.1.17(1)-release(i686-pc-msys)
GNU sed版本4.2.1(相同)

在这个平台上,变量可以是例如用作:

sed "/${EnvVar2}/{:a;N;s/${EnvVar2}\n${EnvVar2}/${EnvVar2}/p;ta;s/${EnvVar2}\n${EnvVar}/Order ${EnvVar}/}"

在此平台上,使用"..."以便能够使用变量非常重要 它不适用于'...'

正如@edMorton暗示的那样,在所有平台上都要小心,但是尝试替换(使用变量)看起来像使用变量的文本。例如。用"文字$ 123"在bash中。在这种情况下,不使用变量,而是尝试替换看起来像变量的文本,使用'...'而不是"..."是可行的方法。

答案 1 :(得分:0)

sed用于单独行的简单替换,全部。如果你发现自己试图使用除s,g和p之外的结构(使用-n)那么你就是在错误的轨道上,因为所有其他的sed结构在20世纪70年代中期发明时已经过时了。

你的问题不是在单行上进行替换,而是在多行记录上进行替换,并且使用GNU awk对多字符RS进行替换是:

$ awk -v RS='^$' -v ORS= '{gsub(/Text 123\nBlue Green/,"Order Blue Green")}1' file
Order Blue Green

但根据您的实际需要,还有其他几种方法。