如何在 bash 脚本中使用 sed 从字符串中解析 "CM-220" 之类的子字符串

How to parse a substring like "CM-220" from a string using sed in a bash script

我有一个字符串

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

我知道我可以像下面这样使用 sed 提取 CM-220

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

但我想更严格地将其提取为alphabet + "-" + number。 我不太擅长正则表达式。

谁能帮帮我或者提供一些我可以参考的链接?非常感谢!

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

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

CM-220

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

如果您要匹配的字符串存储在 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