我正在寻找一种解决方案,可以让我在linux服务器上搜索看起来像文件的文本文件并找到如下模式:
Text 123
Blue Green
每次在文件中找到它时,用一行替换它......
Order Blue Green
我不确定解决这个问题的最简单方法是什么。我见过许多使用SED的指南,但仅用于查找一行并替换它。
答案 0 :(得分:1)
你问sed,这是sed的答案 但是,让我提一下,虽然sed对于这种运动很有趣,但你可能应该选择其他的东西,更灵活,更容易学习;以perl为例。
/Text 123/
:a
N
s/Text 123\nText 123/Text 123/p;
ta;
s///
代码:
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
但根据您的实际需要,还有其他几种方法。