首页 > 解决方案 > 如果前一行与另一个文本匹配,则替换文件中的文本

问题描述

我的文件如下所示:

FooBarA
foo bar
foo = bar
FooBarB
foo bar
foo = bar
FooBarC
foo bar
foo = bar
...

我想做的是编写一个脚本来替换barinfoo = bar但前提是它属于FooBarB. 所以在上面的例子中,只有第二barfoo = bar应该被替换。

我玩过,sed但我就是不能把它做好。我还想避免安装任何不一定预先安装在系统上的工具(我在 Mac OS 上),因为其他团队成员也将使用该脚本。

标签: macosshellawksed

解决方案


这可能对您有用(GNU sed):

sed '/FooBarB/{:a;n;/^$/b;/foo = bar/!ba;s//foo = baz/}' file

匹配字符串FooBarB并开始循环。

取出下一行并研究它。

如果该行为空,则该节已完成,因此请跳出循环。

如果该行不包含 string foo = bar,则获取下一行并继续循环。

否则,用新值替换bar并结束循环。


替代方案(可能适用于 macOS 用户?):

sed -e '/FooBarB/{:a' -e 'n;/^$/b;/foo = bar/!ba;s//foo = baz/;}' file

由于OP将输入数据更改为另一个解决方案的问题:

sed '/FooBar/h;G;/FooBarB/s/foo = bar/foo = baz/;P;d' file

推荐阅读