【问题标题】:sed regex the last matchsed 正则表达式最后一场比赛
【发布时间】:2021-03-29 08:09:45
【问题描述】:

我想在文件的每一行中将最后一个匹配更改为 XXXX 给定文件格式:

"192.xx2" "someting" "another2321SD" 

我想拥有:

"192.xx2" "someting" "XXXX" 

仅使用 sed 我的解决方案:

sed -r 's/"(?:.(?!".+"))+$/XXXX/' file

【问题讨论】:

    标签: regex linux sed


    【解决方案1】:

    记住捕获中最后一对双引号之前的内容。

    sed -r 's/^(.*)"[^"]*"$/\1"XXXX"/'
    

    【讨论】:

      【解决方案2】:

      请记住

      要屏蔽最后一对双引号之间的所有内容,您可以使用

      sed -r 's/(.*)".*"/\1"XXXX"/' file
      sed 's/\(.*\)".*"/\1"XXXX"/' file
      

      sed demo

      s='"192.xx2" "someting" "another2321SD"'
      sed -r 's/(.*)".*"/\1"XXXX"/' <<< "$s"
      # => "192.xx2" "someting" "XXXX"
      

      【讨论】:

      • stackoverflow.com/a/66778854/3220113,您要求改进。我不知道,如果我的答案更好,但您也可以假设" 是输入的最后一个字符:sed 's/"[^"]*"$/"XXXX"/' &lt;&lt;&lt; "$s"。当您不确定时(或者当您为使用的每个双引号付费时),您可以使用rev &lt; &lt;(sed -r 's/[^"]+/XXXX/' &lt;( rev &lt;&lt;&lt;"$s"))。更糟糕的似乎是awk -F '"' 'BEGIN { OFS="\""} { $(NF-1)="XXXX"; print }' &lt;&lt;&lt; "$s"
      • @WalterA 谢谢,沃尔特。假设最后引用的部分确实接近字符串的结尾,我认为当前的方法应该已经足够好了。由于问题标签,我没有考虑awk,我认为可以有更多的假设。
      猜你喜欢
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      相关资源
      最近更新 更多