AWK - 如果不是以特殊符号开头,则替换一个单词

时间:2011-05-18 16:10:00

标签: awk

我尝试翻译这一行:

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

到这一行:

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

但是我没有让它发挥作用。

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

e.g。 awk '{ sub( "ModuleEins", "${ModuleEins}", $0 ); print, $0 }'

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

(?!{)ModuleEins(?!})< - 这个想法我不能在awk里面工作。

5 个答案:

答案 0 :(得分:1)

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

请注意我

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

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

    输出

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

    我希望这会有所帮助。

    P.S。因为您似乎是新用户,如果您得到的答案可以帮助您,请记住将其标记为已接受,并且/或者给它一个+(或 - )作为有用的答案。

答案 1 :(得分:1)

感谢您的帮助!

@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:抱歉,我还不能投票-.-

答案 2 :(得分:0)

Perl正则表达式比awk更好:

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

答案 3 :(得分:0)

sed -e 's/(ModuleEins/(${ModuleEins}/g' -e 's/| ModuleEins/| ${ModuleEins}/g'

答案 4 :(得分:0)

以下解决方案是蛮力的,但易于理解且非常强大......首先将“$ {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”)中描述了这种差异。