【问题标题】:Matching a C++ style regex with sed?将 C++ 风格的正则表达式与 sed 匹配?
【发布时间】:2020-09-17 16:50:08
【问题描述】:

有谁知道如何使用 sed 匹配这个 C++ 风格的正则表达式?特别是使用 (pattern) 和 \n?

将其分解为多个部分
// ZIP code pattern: XXddddd-dddd and variants
regex pat (R"(\w{2}\s*\d{5}(−\d{4})?)");

例如,以下字符串将匹配 AB00000-0000,\1、\2、\3 将从模式空间打印适当的子字符串。

解决方案: 这是 sed 的答案,它占了前两个字符。

$ echo AB00000-0000 | sed 's/\([[:alpha:]]\{2\}\)[[:space:]]*\([[:digit:]]\{5\}\)\(-\([[:digit:]]\{4\}\)\)\{0,1\}/\1 \2 \4/' 
AB 00000 0000

谢谢

【问题讨论】:

  • 请分享输入数据和预期输出。您可以使用 `-E, -r` 选项来扩展正则表达式
  • 您向我们展示的正则表达式模式以\w{2} 开头,这是强制性的,而不是可选的。您的示例字符串 00000-0000 将与模式匹配。
  • 除此之外,\d 是一个 perl 扩展,被grep(带有P 标志)识别,但不能被sedawk 识别;您必须改用[[:digit:]]。为了能够在替换部分中引用[[:digit:]]{5},通过反向引用,您必须将其括在正则表达式的括号中。差不多就是这样。
  • @mathguy 你是对的。我根据您的评论更新了该匹配项。
  • \w 不等同于[[:alpha:]],它等同于[[:alnum:]_]

标签: sed


【解决方案1】:

假设您有一个包含以下内容的文件:

NJ 08542-0033
PA19103-0200
NY10002

然后sed 命令:

sed 's/[[:alpha:]]\{2\}[[:space:]]*\([[:digit:]]\{5\}\)\(-\([[:digit:]]\{4\}\)\)\{0,1\}/\1 \3/' file

将输出:

08542 0033
19103 0200
10002

【讨论】:

  • 谢谢,我忘了加上前两个字符应该在输入中。
  • @notaorb 感谢您的反馈。让我澄清你的要求。是否还要打印输出中的前两个字符?
【解决方案2】:

这个:

\w{2}\s*\d{5}(−\d{4})?

是一个 PCRE(可以在 perl 或 GNU grep -P 中工作,并且可以写成 POSIX ERE(在 awkgrep -E 或 GNU/OSX sed -E 中工作)为:

[[:alnum:]_]{2}[[:space:]]*[[:digit:]]{5}(−[[:digit:]]{4})?

或在 POSIX BRE 中(如在 grepsed 中没有 -E 一样):

[[:alnum:]_]\{2\}[[:space:]]*[[:digit:]]\{5\}\(−[[:digit:]]\{4\}\)\{0,1\}

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 2012-10-12
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2014-09-06
    • 1970-01-01
    相关资源
    最近更新 更多