2015-05-04 72 views
3

我想搜索 - 在bash命令行中替换包含空格的东西,并且我认为sed是最简单的方法。sed(在bash中)与[ t]一起使用,但与 s不兼容?

使用[ \t]表示任一选项卡或空间,以匹配空格,按预期工作:

echo "abc xyz" | sed "s/[ \t]xyz/123/" 
abc123 

但使用的\s代替[ \t]没有,让我吃惊:

echo "abc xyz" | sed "s/\sxyz/123/" 
abc xyz 

我对于bash来说是相当新的,所以我可能会错过一些微不足道的东西,但不管我做什么,我都无法让它工作。使用\\s而不是\s,使用单引号('而不是"),将空白标记放在方括号内(如[\s]或甚至[\\s]),似乎没有任何帮助..?

(编辑)如果它不同于一个sed/bash版本到另一个:我在这里工作的OS X。

此外,我注意到,当我在[ \t]空白部分后添加+,有选择地抢多个空格/制表符如果存在的话,它不工作要么...?

echo "abc xyz" | sed "s/[ \t]+xyz/123/" 
abc xyz 

(又一遍,也试图与\+代替+,和单引号代替双引号,没有什么帮助)

+3

有趣和相关:[?如何匹配在sed空格]( http://superuser.com/a/112837/204979)。基本上,对于POSIX合规性来说,使用字符类[[:space:]]而不是\ s,因为后者是GNU sed extension_因此,您可能正在使用非GNU'sed'。你能提供'sed --version'的输出吗?这里sed上的 – fedorqui

+0

,它按预期工作;作为@fedorqui建议,它确实是gnu sed –

+0

您是否已经彻底阅读了系统上的sed手册页?它应该记录什么工作,哪些不工作。在命令提示符下键入'man sed'。 –

回答

4

作为超级用户的How to match whitespace in sed?看出:

POSIX标准,使用字符类[[:space:]]而不是 \ s,因为后者是GNU sed扩展

所以你可能运行的是非GNU sed版本,因此\s不适用于你。

有两种解决方法:

  • 要使用(空间)和\t在一起,就像你在干什么。
  • 使用[[:space:]]
+0

确认,谢谢,它适用于[[:space:]] 但是,+修饰仍然不会没有工作,有什么想法? 请注意''[[:space:]] \ {1,999 \}'* does *工作,但'[[:space:]] +'或'[[:space:]] \ +'不。 – RocketNuts

+1

要正常使用'+',您需要将其转义:'\ +'或使用'-r'作为扩展正则表达式:'sed -r“s/[[:space:]] +/X /”' – fedorqui

+2

@RocketNuts [符合POSIX的语法](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_06)for _one或更多matches_是'\ {1,\}' - 其他任何东西都是一个扩展。 –

1
echo 'abc xyz<>abcxyz' | sed 's/[[:space:]]xyz/123/g' 
abc123<>abcxyz 
echo 'abc xyz<>abcxyz' | sed "s/[[:space:]]xyz/123/g" 
abc123<>abcxyz 

不会对工作很老的SED的版本,但罚款GNU的sed为POSIX投诉(AIX,...)

相关问题