【问题标题】:Why does this sed command not match whitespace?为什么这个 sed 命令不匹配空格?
【发布时间】:2012-09-01 17:01:03
【问题描述】:

这个 bash 脚本应该从 grep 结果中删除前导空格:

#!/bin/bash
grep --color=always $@ | sed -r -e's/:[[:space:]]*/:/'

但它与空格不匹配。如果我将替换文本更改为“-”,则会显示在输出中,但它仍然不会删除空格。我试过没有“*”,转义“*”,使用“+”等,但没有任何效果。有谁知道为什么不?

(我在 Ubuntu 12.04 上使用 sed 版本 4.2.1。)


谢谢大家,这是我修改后的脚本,它显示 grep 颜色并修剪前导空白:

#!/bin/bash
grep --color=always $@ | sed -r -e's/[[:space:]]+//'

【问题讨论】:

    标签: bash sed grep whitespace


    【解决方案1】:

    grep 输出的颜色信息采用特殊字符序列的形式(请参阅this StackOverflow question 的答案),因此如果冒号是彩色的而空格不是彩色的,反之亦然,那么这意味着其中之一这些字符序列将位于它们之间,因此sed 不会将它们视为相邻字符。

    【讨论】:

      【解决方案2】:
      grep --color=always $@ |sed 's/^ //g'
      

      删除前导空格。

      【讨论】:

        【解决方案3】:

        您需要删除 --color 选项才能使其正常工作。颜色代码混淆了 sed:

        grep  $@ | sed -r -e's/:[[:space:]]*/:/'
        

        【讨论】:

        • +1 - 太棒了。删除我的答案。每天学习新东西。
        • @MichaelFoukarakis 因为在grep --color 的输出中实际上没有:[[:space:]] —— 而是有一堆\033[ 转义序列(可能因终端而异),用于着色.
        【解决方案4】:

        字符类\s将匹配空白字符和

        例如:

        $ sed -e "s/\s\{3,\}/  /g" inputFile
        

        将用两个空格替换至少 3 个空格的每个序列。

        【讨论】:

          猜你喜欢
          • 2013-05-04
          • 1970-01-01
          • 2021-12-04
          • 1970-01-01
          • 1970-01-01
          • 2018-01-25
          • 2023-04-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多