在 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 中使用反向引用正则表达式的主要内容,如果未能解决你的问题,请参考以下文章