【问题标题】:How to parse a substring like "CM-220" from a string using sed in a bash script如何在 bash 脚本中使用 sed 从字符串中解析像“CM-220”这样的子字符串
【发布时间】:2021-06-25 22:13:25
【问题描述】:

我有一个字符串

blah\n blah\n blah Refs: CM-220

我知道我可以使用 sed 提取 CM-220,如下所示

echo 'blah\n blah\n blah Refs: CM-220' | sed 's/.*Refs: \([^ ]*\).*/\1/'

但我想让它更严格地提取为 字母 + "-" + 数字。 我不是很擅长正则表达式。

任何人都可以帮助我或提供一些我可以参考的链接吗?非常感谢!

【问题讨论】:

  • 如果字符串是一个shell变量,我会使用bash内置的正则表达式,fwiw。
  • echo 'blah\n blah\n blah Refs: CM-220' | sed 's/.*Refs: \([[:alpha:]]\{2\}\).*\([[:digit:]]\{2\}\)/\1 \2/'
  • @Shawn 感谢您的回答!可以举个例子吗?
  • 当我在电脑而不是手机时,当然可以。

标签: regex string bash sed script


【解决方案1】:

您可以将此sedERE 模式一起使用,即-E 选项:

echo 'blah\n blah\n blah Refs: CM-220' |
sed -E 's/.*Refs: ([[:alpha:]]+-[[:digit:]]+).*/\1/'

CM-220

[[:alpha:]]+-[[:digit:]]+ 是您所需模式的翻译:alphabet + "-" + number 其中[[:alpha:]]+ 匹配1 个或多个字母字符,[[:digit:]]+ 匹配1 个或多个数字。

【讨论】:

    【解决方案2】:

    如果您要匹配的字符串存储在 shell 变量中,您可以使用 bash 的内置正则表达式来执行此操作,而不必执行 sed 或其他外部程序:

    #!/usr/bin/env bash
    
    str="blah
     blah
     blah Refs: CM-220"
    re="Refs: ([[:alpha:]]+-[[:digit:]]+)"
    
    if [[ $str =~ $re ]]; then
        printf "Found: %s\n" "${BASH_REMATCH[1]}"
    fi
    

    【讨论】:

    • 感谢您的回答。我对其进行了测试,发现 BASH_REMATCH[1] 是 CM-220,BASH_REMATCH[0] 是“Refs: CM-220”。这是bash内置正则表达式的规则吗?所以我们使用 BASH_REMATCH[1] 来得到我们想要的。
    • @echo 数组的第一个元素为匹配的完整文本,其余为第一个、第二个等捕获组。
    猜你喜欢
    • 1970-01-01
    • 2019-01-08
    • 2017-11-04
    • 2015-09-04
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2012-04-09
    相关资源
    最近更新 更多