在 sed 中使用反向引用正则表达式

Posted

技术标签:

【中文标题】在 sed 中使用反向引用正则表达式【英文标题】:using backreferences regex in 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

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

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

【问题讨论】:

【参考方案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:] 是空格和制表符

【讨论】:

以上是关于在 sed 中使用反向引用正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

如何在正则表达式中反向引用“内部”选择( () )?

正则表达式;反向引用字符集中不匹配的字符

正则——反向引用

Java中的正则表达式反向引用

是否有用于反向引用的大写/小写版本的正则表达式替换术语? [复制]

IntelliJ 中的正则表达式反向引用