在 Bash 中有没有办法从一行中提取一个单词和它后面的 n 个字符?

In Bash is there a way to extract a word and n characters after it from a line?

我正在尝试从字符串中提取 JIRA 票证编号。

Jira 票证可能会在行中的任何位置提及,例如:

  1. 合并拉取请求 #1387 来自 Config-change/REL-12345

  2. REL-12345:在配置级别启用 XAPI

我只想要 REL-12345 作为输出。

有人可以帮忙吗。谢谢!

如果这是标准......

输入:合并来自 Config-change/REL-12345

的拉取请求 #1387
echo "Merge pull request #1387 from Config-change/REL-12345" | cut -d/ -f2

输入:REL-12345:在配置级别启用 XAPI

 echo "REL-12345: Enable XAPI at config level" | cut -d: -f1

您可以将字符串传递给 sed 并使用 REGEX 进行替换,如下所示:

myString="This is REL-12345 a test string "
sed -n 's/.*\(\REL-5*[0-9]*\).*//p' <<< $myString

这应该 return: REL-12345

示例数据:

$ cat jira.dat
Merge pull request #1387 from Config-change/REL-12345
REL-12346: Enable XAPI at config level

一个想法使用 bash 正则表达式匹配和结果 BASH_REMATCH[]:

regex='(REL-[[:digit:]]+)'

while read -r line
do
    printf "\n########## ${line}\n"
    [[ "${line}" =~ ${regex} ]] && echo "${BASH_REMATCH[1]}"
done < jira.dat

这会生成:

REL-12345
REL-12346
grep -Eow 'REL-[0-9]+'

+是一个或多个,指定N个数(例如5):

grep -Eow 'REL-[0-9]{5}
  • 范围:{3,6} 是 3 到 6,{5,} 是 5 或更多,等等
  • 在 GNU/Linux 上:man grep -> /Repetition 了解更多详情。
  • -o 只打印匹配的字符串
  • -w 只匹配完整的单词,即。避免匹配 WREL-12345 (例如)
  • grep -Eow 'REL-[[:alnum:]]+' 字母和数字(在 REL- 之后)。

示例数据:

$ cat jira.dat
Merge pull request #1387 from Config-change/REL-12345
REL-12346: Enable XAPI at config level

一个想法使用 grep:

$ grep -Eo 'REL-[[:digit:]]+' jira.dat
REL-12345
REL-12346