sed(在 bash 中)适用于 [ \t] 但不适用于 \s?

sed (in bash) works with [ \t] but not with \s?

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

使用 [ \t] 表示制表符或 space,以匹配白色 space,按预期工作:

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

但是使用 \s 而不是 [ \t] 并没有,令我惊讶的是:

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

我是 bash 的新手,所以我可能遗漏了一些微不足道的东西,但无论我做什么,我都无法让它发挥作用。使用 \s 而不是 \s,使用单引号(' 而不是 "),将白色 space 标记放在方括号内(如 [\s] 甚至 [\s]), 似乎没有任何帮助..?

(edit) 以防它从一个 sed / bash 版本到另一个不同:我在这里研究 OS X。

此外,我注意到当我在 [ \t] 白色 space 部分后添加 + 时,如果存在,可选择抓取多个 space/tab 字符,它不会'也不工作了...??

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

(同样,也尝试过使用 \+ 而不是 +,并使用单引号而不是双引号,没有任何帮助)

如 SuperUser 中所见 How to match whitespace in sed?:

For POSIX compliance, use the character class [[:space:]] instead of \s, since the latter is a GNU sed extension

所以你可能 运行 是非 GNU sed 版本,因此 \s 对你不起作用。

你有两个解决方案:

  • 同时使用 </code> (space) 和 <code>\t,就像您在做的那样。
  • 使用[[:space:]].
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,...)