sed(以bash格式)可用于[\ t],但不能用于\ s?

Roc*_*uts 4 regex macos bash sed removing-whitespace

我想在bash命令行上搜索替换包含空格的内容,并且我认为sed是最简单的方法。

使用[ \t]表示制表符或空格来匹配空白,可以按预期工作:

echo "abc xyz" | sed "s/[ \t]xyz/123/"
abc123
Run Code Online (Sandbox Code Playgroud)

但是使用\s代替[ \t]不是,令我惊讶的是:

echo "abc xyz" | sed "s/\sxyz/123/"
abc xyz
Run Code Online (Sandbox Code Playgroud)

我对bash还是很陌生,所以我可能会错过一些琐碎的事情,但是无论我做什么,我都无法使它正常工作。使用\\snot代替\s,使用单引号('代替"),将空格标记放在方括号内(例如[\s]甚至[\\s]),似乎没有任何帮助。

(编辑)如果它不同于一个sed / bash版本到另一个版本:我在这里使用OSX。

另外,我注意到,当我+[ \t]空白部分之后添加a时,可以选择获取多个空格/制表符(如果存在),那么它将不再起作用... ??

echo "abc xyz" | sed "s/[ \t]+xyz/123/"
abc xyz
Run Code Online (Sandbox Code Playgroud)

(同样,也尝试使用\+代替+,用单引号代替双引号,没有任何帮助)

fed*_*qui 5

如SuperUser的如何在sed中匹配空白?

为了符合POSIX,请使用字符类[[:space:]]代替\ s,因为后者是GNU sed扩展名

因此,您可能正在运行非GNU sed版本,因此\s对您不起作用。

您有两种解决方案:

  • 像以前一样使用(空间)并\t在一起。
  • 使用[[:space:]]

  • 要正常使用 `+`,您需要转义它: `\+` 或使用 `-r` 来扩展正则表达式: `sed -r "s/[[:space:]]+/X/"` (2认同)
  • @RocketNuts [符合POSIX的语法](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_06)_个或多个匹配项是\\ {1,\}`-其他都是扩展名。 (2认同)