我尝试翻译这一行:
(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里面工作。
答案 0 :(得分:1)
这是一个脆弱的解决方案,但确切地回答了你的问题。
请注意我
print
/[^{]ModuleEins[^}]/
[^{]
是脆弱性的来源。代码
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”)中描述了这种差异。