【问题标题】:Search a pattern in file and replace another pattern in the same line在文件中搜索一个模式并替换同一行中的另一个模式
【发布时间】:2018-03-22 15:40:00
【问题描述】:

我想在一堆源文件中搜索一个模式。图案应充当标记。如果找到该模式,我想通过替换另一个字符串来处理该行

例如:

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 是否支持搜索模式但替换匹配行中的另一个字符串?

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

【问题讨论】:

    标签: bash shell awk sed


    【解决方案1】:

    使用 GNU sed 你可以做到

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

    【讨论】:

      【解决方案2】:

      你很亲密:

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

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

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

      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
      

      【讨论】:

        【解决方案3】:

        尝试中的搜索模式包含许多多余/错误的逗号——这就是匹配失败的原因。模式和搜索默认使用/ 字符分隔。 (除非您有特定的理由,否则最好坚持使用/ 以提高可读性。)

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

        另外,匹配模式后不需要使用括号。

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

        @kvantour 注意到您在匹配中指定了一个特殊的破折号字符 ,它是非 ascii 并建议解决此问题的方法 - 但我们也可以使用一个技巧来完全匹配您想要的内容并制作它方面更加突出(注意:sh/bash 假定为 shell ——注意谨慎使用引号)。

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

        或者在两个地方匹配连字符和破折号:

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

        我们可以在此基础上进一步扩展,包括破折号——留给读者作为练习。为了帮助进行该练习,以下是我如何解码您的 em dash char:

        echo '—' | od -c
        

        【讨论】:

          猜你喜欢
          • 2015-06-14
          • 2013-12-03
          • 2021-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-26
          相关资源
          最近更新 更多