【发布时间】:2015-07-13 18:16:45
【问题描述】:
我想在 bash 命令行上搜索替换包含空格的内容,我认为 sed 是最简单的方法。
使用[ \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
(同样,也尝试用\+ 代替+,用单引号代替双引号,没有任何帮助)
【问题讨论】:
-
有趣和相关的:How to match whitespace in sed?。基本上,为了符合 POSIX,使用字符类 [[:space:]] 而不是 \s,因为后者是 GNU sed 扩展 所以你可能在非 GNU
sed.你能提供sed --version的输出吗? -
在这里的 sed 上,它按预期工作;正如@fedorqui 建议的那样,它确实是 gnu sed
-
您是否仔细阅读了系统上的 sed 手册页?它应该记录什么有效和无效。在命令提示符处键入
man sed。 -
啊,谢谢,
sed --version说illegal option -- -所以我猜它不是 GNU :)
标签: regex macos bash sed removing-whitespace