我有此列表(例如):
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
我该怎么办?谢谢您的帮助
答案 0 :(得分:3)
您的awk
命令仅显示第3列的值(由于print $3
),您只需在第3列的末尾添加\$
,因为$
是与行/字符串的结束位置。
您可以使用
awk '{ gsub(/\$/,"\\$",$3) } 1'
在这里,gsub(/\$/,"\\$",$3)
查找文字$
字符并将其替换为\$
,最后1
使awk
打印所有值。 / p>
答案 1 :(得分:2)
awk '{ gsub("\\$","\\$",$3); print $3 }' file
password
pa\$sword
password
pas\$word
awk
的{{1}}函数收到一个gsub
作为其第一个参数,因此您需要转义regex
。
双引号内的内容将首先进行扩展,然后如果它是regex参数,则将其馈送到regex引擎。
因此,对于 from 部分,我们需要使用$
或"\\$"
,它们的工作方式相同。
在这里看起来很奇怪, from 和 to 看起来相同,但实际上却不同。
/\$/
表示行或字段的结尾,这就是您替换错误位置的原因。