【问题标题】:Regex to add a character in front of a specific character in a specific column正则表达式在特定列中的特定字符前面添加一个字符
【发布时间】:2019-07-30 09:48:13
【问题描述】:

我有这个列表(例如):

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

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

【问题讨论】:

    标签: regex shell awk replace


    【解决方案1】:

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

    你可以使用

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

    online awk demo

    在这里,gsub(/\$/,"\\$",$3) 找到文字 $ 字符并将它们替换为 \$s,最后将 1 替换为 awk 打印所有值。

    【讨论】:

      【解决方案2】:
      awk '{ gsub("\\$","\\$",$3); print $3 }' file
      password
      pa\$sword
      password
      pas\$word
      

      awkgsub 函数接收regex 作为其第一个参数,因此您需要转义$
      双引号内的内容将首先展开,如果是正则表达式参数,则将其提供给正则表达式引擎。
      所以我们需要在 from 部分使用"\\$"/\$/,它们的工作方式相同。
      这里看起来很奇怪,fromto 看起来一样,但它们实际上是不同的。

      $ 在正则表达式中表示行或字段的结尾,这就是您替换错误位置的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-08
        • 1970-01-01
        • 1970-01-01
        • 2014-01-15
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 2014-03-04
        相关资源
        最近更新 更多