【问题标题】:using backreferences regex in sed在 sed 中使用反向引用正则表达式
【发布时间】:2011-04-04 05:02:28
【问题描述】:

我想用单个字符删除文件中的多个空格。 示例

cat      kill    rat
dog      kill    cat

我使用了以下正则表达式,它似乎在 http://www.regexpal.com/ 中匹配,但在 sed 中不起作用。

([^ ])*([ ])*

我是这样使用 sed 命令的:

sed s/\(\[\^\ \]\)*\(\[\ \]\)*/\$1\|/g < inputfile

我期待,

cat|kill|rat
dog|kill|cat

但我无法让它工作。任何帮助将非常感激。谢谢。

编辑: 请注意,猫/狗可以是除空格以外的任何字符。

【问题讨论】:

    标签: regex unix sed ksh aix


    【解决方案1】:

    sed 带有反斜杠的反向引用,所以使用 \1 而不是 $1。 用引号括住你的表达:

    sed 's/match/replace/g' < inputfile
    

    联机帮助页是 Linux 世界中最好的发明:man sed

    注意*,它实际上可以匹配任何内容。 如果您想用“|”替换多个空格,请使用此 RE:

    sed -r 's/ +/\|/g'
    

    来自man sed

    -r, --regexp-extended
       use extended regular expressions in the script.
    

    如果您只想替换所有空格,则不需要任何反向引用。 如果您也想匹配制表符,请将(空格)替换为\s

    【讨论】:

    • 谢谢。但是正则表达式不能正常工作。为什么 \1 匹配每个字符而不是字符串“cat”“dog”
    • 因为您使用的是*,它无法匹配任何内容。请参阅我编辑的答案。
    • 来自man sed 用于--regexp-extended 开关:for portability use POSIX -E
    • POSIX sed 是否支持反向引用?编辑:是的,它们是:pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html“字符\n,其中 n 是数字,应替换为与相应的反向引用表达式匹配的文本。”
    【解决方案2】:

    我知道 sed 想要的 OP 并且问题很老,但是 tr -s ' ' 输入呢?

    【讨论】:

      【解决方案3】:

      怎么样:

      s/\s+/\|/g
      

      【讨论】:

        【解决方案4】:

        你可以使用:

        sed -e 's/[[:blank:] ]/\|/g '

        whete [:blank:] 是空格和制表符

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-01-15
          • 1970-01-01
          • 1970-01-01
          • 2017-04-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-23
          相关资源
          最近更新 更多