正则表达式可在特定列中的特定字符前面添加一个字符

时间:2019-03-08 11:05:32

标签: regex shell awk replace

我有此列表(例如):

192.168.1.76 admin password
192.168.1.90 admin pa$sword
192.168.1.12 u$er password
192.168.1.200 user pas$word

我想在每个\之前添加一个$(仅在第三栏中)。

使用awk,我尝试了以下方法:

awk '{ gsub("$","\\$",$3); print $3 }'

但它返回此:

password\$
pas$word\$
password\$
pas$word\$

我想要这样:

password
pas\$word
password
pas\$word

我该怎么办?谢谢您的帮助

2 个答案:

答案 0 :(得分:3)

您的awk命令仅显示第3列的值(由于print $3),您只需在第3列的末尾添加\$,因为$是与行/字符串的结束位置。

您可以使用

awk '{ gsub(/\$/,"\\$",$3) } 1'

请参见online awk demo

在这里,gsub(/\$/,"\\$",$3)查找文字$字符并将其替换为\$,最后1使awk打印所有值。 / p>

答案 1 :(得分:2)

awk '{ gsub("\\$","\\$",$3); print $3 }' file
password
pa\$sword
password
pas\$word

awk的{​​{1}}函数收到一个gsub作为其第一个参数,因此您需要转义regex
双引号内的内容将首先进行扩展,然后如果它是re​​gex参数,则将其馈送到regex引擎。
因此,对于 from 部分,我们需要使用$"\\$",它们的工作方式相同。
在这里看起来很奇怪, from to 看起来相同,但实际上却不同。

正则表达式中的

/\$/表示行或字段的结尾,这就是您替换错误位置的原因。