【问题标题】:REGEX help needed for deleting certain lines删除某些行需要 REGEX 帮助
【发布时间】:2015-03-09 18:09:58
【问题描述】:

我明白为什么

echo abc 123 xyz|sed "/abc\s*\d*\s*$/d"

生产

abc 123 xyz

因为模式是 abc 后跟 0 个或多个空格,后跟 0 个或多个数字,后跟 0 个或多个空格,然后是行尾,并且由于 xyz 字符,数据与该规范不匹配。

为什么

echo abc 123  |sed "/abc\s*\d*\s*$/d"

生产

abc 123

而不是 null 输出,因为数据与模式匹配?

【问题讨论】:

标签: regex sed


【解决方案1】:

因为\d 不是sed 支持的字符类:

$ echo abc 123  |sed '/abc\s*\d*\s*$/d'
abc 123

改用[:digit:]

$ echo abc 123  |sed '/abc\s*[[:digit:]]*\s*$/d'
$

\d 可用作 perl 或 python 等语言的正则表达式扩展。 sed 支持的正则表达式语法更基本。有关 GNU sed 支持的正则表达式语法的概述,请参阅 here

请注意,[:digit:] 将适用于 unicode 字体,而 [0-9] 则不会。因此,所有新代码都应使用[:digit:]

sed 正则表达式支持的字符类

POSIX sed 记录在 here。 POSIX 要求 sed 支持基本正则表达式 (BRE)。 BRE 的 POSIX 规范是 here,并规定,包括 [:digit:]sed 在内的正则表达式必须在所有语言环境中支持以下字符类:

[:alnum:]   [:cntrl:]   [:lower:]   [:space:]
[:alpha:]   [:digit:]   [:print:]   [:upper:]
[:blank:]   [:graph:]   [:punct:]   [:xdigit:]

GNU's sed 提供了几个扩展。这包括用于“单词”字符的\w,表示字母数字和下划线,以及匹配单词边界的\b。正如 Bill Gradwohl 所观察到的,\s 表示空白,在 GNU sed 下工作,但没有在文档中提及。

【讨论】:

  • 我试过 man sed 但没用。我尝试了 man regex 并没有好多少。根据您的链接,sed 也不支持 \s。
  • @BillGradwohl 很好的观察。我在 GNU 的文档中也找不到 \s。我更新了答案,提供了有关支持的字符类和指向 POSIX sed 文档的链接的更多信息。
【解决方案2】:

sed 程序对某些正则表达式结构的支持有限,特别是\d。您可以改用 [0-9] 之类的东西来解决这个问题。

或者,由于查找或删除行更多是 grep 的权限,您可以使用 it 为您完成这项工作。假设你有GNU grep,它可以很好地执行 Perl 正则表达式:

echo abc 123  | grep -Pv "abc\\s*\\d*\\s*$"

如果您必须使用sed,例如,您需要在每一行上执行许多复杂的命令,请随意忽略此建议。否则,我的建议是为工作选择更合适的工具。

【讨论】:

    【解决方案3】:

    \d 的解决方法

    echo abc 123  |sed "/abc\s*[0-9]*\s*$/d"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      相关资源
      最近更新 更多