【问题标题】:sed (in bash) works with [ \t] but not with \s?sed(在 bash 中)适用于 [ \t] 但不适用于 \s?
【发布时间】: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 --versionillegal option -- - 所以我猜它不是 GNU :)

标签: regex macos bash sed removing-whitespace


【解决方案1】:

在 SuperUser 的 How to match whitespace in sed? 中看到:

为了符合 POSIX,请使用字符类 [[:space:]] 而不是 \s,因为后者是一个 GNU sed 扩展

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

您有两种解决方案:

  • (空格)和\t 一起使用,就像您之前所做的那样。
  • 使用[[:space:]]

【讨论】:

  • 已确认,谢谢,它适用于 [[:space:]] 但是,+ 修饰符仍然不起作用,有什么想法吗?请注意,[[:space:]]\{1,999\} 确实有效,但 [[:space:]]+[[:space:]]\+ 无效。
  • 要正常使用+,您需要转义它:\+ 或使用-r 扩展正则表达式:sed -r "s/[[:space:]]+/X/"
  • @RocketNuts POSIX-compliant syntax 用于一个或多个匹配\{1,\} - 其他任何东西都是扩展。
【解决方案2】:
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,...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多