【问题标题】:AWK - replace a word if it not begin with special symbolAWK - 如果单词不是以特殊符号开头,则替换它
【发布时间】:2015-10-29 11:48:41
【问题描述】:

我试着翻译这行:

(ModuleEins = WertA | ${ModuleEins} = WertB | ModuleEins = WertB)

到这一行:

(${ModuleEins}= WertA | ${ModuleEins}= WertB | ${ModuleEins}= WertB)

但我没有让它工作。

我有一个复杂的 awk 脚本,我在其中运行循环内的替换语句。

例如awk '{ sub( "ModuleEins", "${ModuleEins}", $0 ); print, $0 }'

我不知道如何在 awk 中替换一个不以特殊字符开头的单词。

(?!{)ModuleEins(?!})

【问题讨论】:

    标签: awk


    【解决方案1】:

    这是一个脆弱的解决方案,但准确地回答了您的问题。

    注意我

    1. 将 sub(...) 更改为 gsub
    2. 删除了 ',' 在print 之后
    3. 将搜索目标更改为正则表达式/[^{]ModuleEins[^}]/
    4. 并添加了一个 '&' 来捕获 reg exp 的第一个字符,而 [^{] 是脆性的来源。

    代码

    print -- '(ModuleEins = WertA | ${ModuleEins} = WertB | ModuleEins = WertB)' \
    | awk '{ gsub( /[^{]ModuleEins[^}]/, "&${ModuleEins}", $0 ); print $0 }'
    

    输出

    (ModuleEins ${ModuleEins}= WertA | ${ModuleEins} = WertB | ModuleEins ${ModuleEins}= WertB)
    

    我希望这会有所帮助。

    附:由于您似乎是新用户,如果您得到对您有帮助的答案,请记住将其标记为已接受,和/或给它一个 +(或 -)作为有用的答案。

    【讨论】:

      【解决方案2】:

      感谢您的帮助!

      @shellter 子模式[^{]ModuleEins[^}] 对我不起作用,因为[^{] 是除{ 之外的符号。如果我有"(ModuleEins=value)",那么结果将是"${ModuleEins}value)" 而不是"(${ModuleEins}=value)"。这对我来说是错误的。

      我在我的 awk 脚本中尝试了 glenn jackman 的想法并让它发挥作用:

      gsub( "\\$", "\\$", $0 )

      "echo \""$0"\" | perl -pe 's/(?<!{)"part[i]"/\\${"part[i]"}/g'" |& getline $0

      gsub( "\\\\\\$", "$", $0 )

      ps:抱歉我还不能投票-.-

      【讨论】:

      • üchler : You write ...' 如果我有 "(ModuleEins=value)" ,那么结果将是 "${ModuleEins}value)" ' 。是的,这就是为什么我说我的答案是一个脆弱的解决方案。数据必须与您指定的完全相同。我很高兴你有更好的解决方案。我相信您可以在真正回答您的问题的答案上打勾,并给该应得的人 15 分 ;-)(不是我)。祝你好运!
      • 在我写问题的时候,我给出了错误的数据?现在我错过了 4 分的投票^^ 但我不会忘记 :)
      【解决方案3】:

      Perl 正则表达式比 awk 好在这里:

       perl -pe 's/(?<!\${)ModuleEins/\${$&}/g'
      

      【讨论】:

        【解决方案4】:
        sed -e 's/(ModuleEins/(${ModuleEins}/g' -e 's/| ModuleEins/| ${ModuleEins}/g'
        

        【讨论】:

          【解决方案5】:

          以下解决方案是蛮力的,但易于理解且非常健壮...首先 gsub 将“${ModuleEins}”更改为“ModuleEins”,然后更改所有“ModuleEins”。需要使用“\”来转义某些字符,因为 gsub 的第一个参数是扩展正则表达式。在这种迷你语言中,字符“$”、“{”和“}”默认为元字符,由 gsub 解释,具有特殊含义。

          $ x='(ModuleEins = WertA | ${ModuleEins} = WertB | ModuleEins = WertB)'
          $ echo $x | awk '{ gsub(/\$\{ModuleEins\}/, "ModuleEins"); gsub(/ModuleEins/, "${ModuleEins}") } 1'
          (${ModuleEins} = WertA | ${ModuleEins} = WertB | ${ModuleEins} = WertB)
          

          为了简洁,SED 实现可能是更好的方法:

          $ echo $x | sed 's/\${ModuleEins}/ModuleEins/g; s/ModuleEins/${ModuleEins}/g'
          (${ModuleEins} = WertA | ${ModuleEins} = WertB | ${ModuleEins} = WertB)
          

          请注意,上述转义规则不同,因为 AWK 使用扩展正则表达式作为搜索模式,而 SED 使用基本/传统正则表达式。两种正则表达式语言之间的区别在于元字符的转义,这在 egrep(3) 手册中有描述(搜索“Basic vs Extended Regular Expressions”)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-11-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-15
            • 2021-10-21
            • 2019-11-19
            相关资源
            最近更新 更多