【问题标题】:Using sed to delete a case insensitive matched line使用 sed 删除不区分大小写的匹配行
【发布时间】:2011-01-10 13:36:17
【问题描述】:

如何匹配不区分大小写的正则表达式并同时删除它

我读到要获得不区分大小写的匹配,请使用标志“i”

sed -e "/pattern/replace/i" filepath

并删除使用 d

sed -e "/pattern/d" filepath

我还了解到我可以组合多个标志,例如 2iw

我想知道 sed 是否可以同时结合 i 和 d 我尝试了以下方法,但没有成功

sed -e "/pattern/replace/id" filepath > newfilepath

【问题讨论】:

    标签: sed case-insensitive


    【解决方案1】:

    我制作了这个单行代码,因为 Ansible 无法处理具有相同名称的不同 lv。这会将 CSV 附近的内容转换为完美的 JSON。可能,您想更改 -F 标志以更改字段分隔符。

    lvs | perl -ane '
       local %tmp,$i=0;
       while($i<@f){
         $tmp{$f[$i]}=$F[$i] if $F[$i];
         $i++
       };
       if(@f){push @ans,\%tmp}
       else{ @f=@F }; 
       END { print to_json(\@ans,{pretty=>1}) }
    ' -MJSON
    

    【讨论】:

      【解决方案2】:

      如果不区分大小写,请使用/I 而不是/i

      sed -e "/pattern/Id" filepath
      

      【讨论】:

      【解决方案3】:

      您也可以使用 (g)awk。

      # print case insensitive
      awk 'BEGIN{IGNORECASE=1}/pattern/{print}' file
      
      # replace with case insensitive
      awk 'BEGIN{IGNORECASE=1}/pattern/{gsub(/pattern/,"replacement")}1' file
      

      或者只使用 shell(bash)

      #!/bin/bash
      shopt -s nocasematch
      while read -r line
      do
          case "$line" in
              *pattern* ) echo $line;
          esac
      done <"file"
      

      【讨论】:

      • 唯一的事情是......它保留了要删除的行。所以:awk 'BEGIN{IGNORECASE=1}!/pattern/{print}' file
      • shopt 命令是 bash 特定的,不受 ksh 支持。
      猜你喜欢
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 2017-11-14
      • 2012-03-15
      相关资源
      最近更新 更多