搜索文件中匹配模式的行,但将字符串匹配替换为同一行中的第二个模式

时间:2018-03-22 17:33:04

标签: bash macos shell awk sed

需要Shell / Bash Geeks的帮助,特别是在Mac OS上

我想在一堆源文件中搜索一个模式,但是想要在具有此模式的行中替换另一个字符串。

例如:

Private const String myTestString = @“VAL15”; // STRING-REPLACE-VAL##

在这里,我想在源文件中搜索“STRING-REPLACE-VAL ##”模式,然后将VAL15替换为VAL20。

输出:

private const String myTestString = @“VAL20”; // STRING—REPLACE-VAL##

尝试下面的命令,但没有按预期工作。

sed -i '.bkp' '/,STRING—REPLACE-VAL##/ {; s/,VAL15,/,VAL20,/;}' myTestFile.cpp

Q2 - 是否可以搜索STRING—REPLACE-VAL##,然后在同一行中搜索匹配的模式@"VAL??",并将15替换为20

sed支持搜索&很容易替换相同的模式,但不确定sed是否支持搜索模式但是替换匹配行中的另一个字符串?

任何帮助将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:-1)

你可以用简单的东西来做,如下:

sed -i 's/VAL15\(.*STRING-REPLACE-VAL\)/VAL20\1/'

如果某行包含VAL15后跟STRING-REPLACE-VAL,则会将VAL15替换为VAL20

如果订单不是保证,你当然会变得更复杂:

sed -E '/STRING-REPLACE-VAL/bx ; b ; :x ; s/VAL15/VAL20/ ;'

请注意,;是特定于GNU的,并且可能无法在所有平台上运行(我相信您可以在其他平台上使用-e)。该语句基本上说:如果该行匹配STRING-REPLACE-VAL,则转移到标签:x,否则转到结尾。如果您去标记x:,请在该行上运行s/VAL15/VAL20。请参阅here以获取参考资料