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

5
我想用单个字符去除文件中的多个空格。 示例:
cat      kill    rat
dog      kill    cat

我使用了以下正则表达式,在 http://www.regexpal.com/ 上似乎匹配成功,但在 sed 中无法工作。

([^ ])*([ ])*

我使用sed命令如下所示:

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

I expect,

cat|kill|rat
dog|kill|cat

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

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

4个回答

6

sed使用反斜杠进行反向引用,因此请使用\1代替$1。 用引号括起您的表达式:

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

Manpages是Linux世界中最好的发明:man sed

注意*,它实际上可以匹配任何字符。 如果您想用'|'替换多个空格,请使用此正则表达式:

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

来自man sed

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

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

谢谢。但是正则表达式没有正确工作。为什么 \1 匹配每个字符而不是字符串 "cat" 和 "dog"? - jgua1
因为你正在使用 *,它可以匹配任何字符。请参考我的修改后的答案。 - Lekensteyn
1
man sed 中了解 --regexp-extended 开关:为了可移植性,请使用 POSIX -E - davemyron
POSIX sed是否支持反向引用?编辑:是的,它们是支持的:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html “字符\n(其中n是数字)将被相应反向引用表达式匹配的文本替换。” - Lassi

1

您可以使用:

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

其中 [:blank:] 代表空格和制表符


1

我知道原帖中想要使用 sed,而且这个问题已经很久了,但是 tr -s ' ' input 呢?


0

关于什么:

s/\s+/\|/g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接