sed:在File中搜索Pattern但在同一行中替换另一个字符串模式

时间:2018-03-22 15:40:01

标签: bash shell awk sed

我想在一堆源文件中搜索一个模式。该模式应作为标记。如果找到模式,我想通过执行另一个字符串

的替换来处理该行

例如:

Private const String myTestString = @"VAL15"; // STRING—REPLACE-VAL##

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

输出:

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

你非常接近:

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

在您的原始版本中,您尝试替换",VAL15,",但此字符串不在行(逗号)中。此外,搜索字符串",STRING—REPLACE-VAL##"也是如此。

我发现STRINGREPLACE之间的第一个连字符是em-dash而不是标准-,这可能是另一个问题。确保字符串完全相同。如果您不确定破折号,可以使用

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

并回答您的问题,是的,您可以尝试以下列方式进行多项匹配:

<强> sed

sed -i '/STRING.REPLACE.VAL##/{ /@"VAL/ { s/VAL15/VAL20/ } }' myTestFile.cpp

<强> awk

awk '/STRING.REPLACE.VAL##/&&/@"VAL/{sub("VAL15","VAL20")}1'  myTestFile.cpp

答案 1 :(得分:1)

尝试中的搜索模式包含许多多余/错误的逗号 - 这就是匹配失败的原因。默认情况下,模式和搜索以IFormCollection.TryGetValue("my-parameter", out StringValues myParameter) 字符分隔。 (除非你有特殊的理由不这样做,否则最好坚持/以便于阅读。)

要注意的一件事是确保您的单词完全匹配......并且 VAL15 2 (例如)不匹配。您可以将 VAL15 括在/\<中以匹配字边界。

此外,匹配模式后不需要包装括号。

\>

@kvantour注意到你在匹配中指定了一个特殊的短划线字符sed -i '/STRING—REPLACE-VAL##/ s/\<VAL15\>/VAL20/' myTestFile.cpp ,非ascii&amp;提出了解决这个问题的方法 - 但是我们也可以使用一个技巧来完全匹配你想要的东西并使这个方面更突出(注意:sh / bash假设为shell - 注意小心使用引用)。

或者在两个地方匹配连字符和短划线:

sed -i "/STRING$(printf '\342\200\224')REPLACE-VAL##/ s/\<VAL15\>/VAL20/" myTestFile.cpp

我们可以在此进一步扩展这一点,以包括短划线 - 左边作为读者的练习。为了帮助完成这个练习,以下是我能够解码你的em dash char的方法:

emdash=$(printf '\342\200\224')
sed -i "/STRING[-$emdash]REPLACE[-$emdash]VAL##/ s/\<VAL15\>/VAL20/" myTestFile.cpp

答案 2 :(得分:0)

使用GNU sed,您可以做到

sed -i '/STRING—REPLACE-VAL##/s/VAL15/VAL20/' myTestFile.cpp