【问题标题】:remove string between two character with sed用 sed 删除两个字符之间的字符串
【发布时间】:2012-02-09 11:44:45
【问题描述】:

我有一个这种类型的文件:

16:00 [61]Al-Najma - Al-Rifaa [62]5.06 [63]3.55 [64]1.57 4

我想删除方括号内的所有字符串以获得

16:00 Al-Najma - Al-Rifaa 5.06 3.55 1.57 4

我正在尝试以这种方式使用 sed:

sed 's/\[.*]//g' file1 > file2

但我得到

16:00 1.57 4

sed 's/\[.[1234567890]]//g' file1 > file2

如果字符串包含超过 2 个数字,则不起作用。

我该怎么做?

【问题讨论】:

    标签: sed awk


    【解决方案1】:

    您的模式只允许一个字符,在模式后面添加一个星号会将其扩大到所有匹配的字符。

    sed 's/\[.[1234567890]]*//g' file1 > file2
    

    替代方案:

    sed 's/\[^\]*//g' file1 > file2
    

    这意味着:在开始的“[”之后,除了“]”之外的所有内容都可以,并且对于尽可能多的字符(“*”)

    进一步阅读 sed:http://www.grymoire.com/Unix/Sed.html

    【讨论】:

    • 这可能适用于这个解决方案,但不能很好地适用于两个字符之间的所有类型的字符串。替代方案?
    • [1234567890] 可以缩短为 [0-9]
    【解决方案2】:

    您的第一个正则表达式不起作用,因为量词 * 是贪婪的,这意味着它匹配尽可能多的字符。由于. 也匹配括号,因此它会继续匹配直到它可以找到的最后一个右括号]

    所以你基本上有两个选择:使用非贪婪量词或限制你可以匹配的字符类型。您已经尝试了第二种解决方案。我会改用否定字符类:

    sed 's/\[[^]]*\]//g'
    

    我不确定 sed 是否有非贪婪量词,但 perl 有:

    perl -lpwe 's/\[.*?\]//g'
    

    【讨论】:

      【解决方案3】:

      转义结束 ] 有帮助吗?

      sed 's/\[.*\]//g' file1 > file2
      

      【讨论】:

      • \[.*\] 是贪婪的,会吞噬第一个 [ 和最后一个 ] 之间的所有字符,包括其他 ][ 的字符。
      【解决方案4】:

      您已经得到sed 的答案,所以我将使用awk 添加其他答案:

      awk '
        BEGIN { 
          FS = "\\[[^]]*\\]"; 
          OFS = " " 
        } 
        { 
          for (i=1; i<=NF; i++) 
            printf "%s", $i 
        } 
        END { 
          printf "\n" 
        }
      ' <<<"16:00 [61]Al-Najma - Al-Rifaa [62]5.06 [63]3.55 [64]1.57 4"
      

      输出:

      16:00 Al-Najma - Al-Rifaa 5.06 3.55 1.57 4
      

      【讨论】:

        【解决方案5】:

        使用awk:

        $ echo '16:00 [61]Al-Najma - Al-Rifaa [62]5.06 [63]3.55 [64]1.57 4' | awk -F '\[[0-9]*\]' '$1=$1'
        16:00  Al-Najma - Al-Rifaa  5.06  3.55  1.57 4
        

        【讨论】:

        • 与我的解决方案相同(未发布);)顺便说一句,两个“\”可以保存。
        【解决方案6】:

        这可能对你有用:

        echo "16:00 [61]Al-Najma - Al-Rifaa [62]5.06 [63]3.55 [64]1.57 4" |
        sed 's/\[[^]]*\]//g'
        16:00 Al-Najma - Al-Rifaa 5.06 3.55 1.57 4
        

        【讨论】:

          猜你喜欢
          • 2021-11-16
          • 2016-04-03
          • 2015-11-10
          • 1970-01-01
          • 2021-05-26
          • 1970-01-01
          • 2016-07-01
          • 1970-01-01
          • 2012-05-14
          相关资源
          最近更新 更多