Bash 提取两个模式之间的字符串

Bash extract string between two patterns

我有一个包含三种行的文件:

[       ]   APPLE
[ORANGE ] * ORANGE      on XXXXXXXXXXXXXXX
[YELLOW ] + BANANA      on XXXXXXXXXXXXXXX

我现在要做的是像下面这样提取水果名称:

APPLE
ORANGE
BANANA

我尝试用 echo ${line:start:end} 提取它,然后才意识到这两条线的长度可能会有所不同。所以我想我必须用模式匹配来做。

我是bash的新手,我应该如何提取水果名称,用sed/awk或任何其他方式?

谢谢!

试试这个 sed

sed 's/^\[....\] . \([A-Za-z0-9]*\).*//' file

grep 与扩展正则表达式 -E-o 标志一起使用 return 仅匹配位

grep -o -E 'SERVICE[_0-9A-Za-z]+' file

+ 将确保大于 9 的数字仍然 returned

已编辑以匹配问题中的更改

您可以使用此 awk 和自定义字段分隔符来获取您的值:

awk -F '\[[^]]+\][ *+]+| *on *' '{print }' file
APPLE
ORANGE
BANANA

这处理像 "star fruit" 这样的双词水果名称,但必须假设尾随的垃圾(如果有的话)以 "on" 开头(即那些 "on XXXXXX")。它还假定水果名称在第一个左方括号 ("]") 之后开始:

sed -e 's/^[^]]*][^A-Za-z]*//' -e 's/\bon\b.*$//'  -e 's/\s*$//' your_file

解释:

-e 's/^[^]]*][^A-Za-z]*//': 删除从开头到第一个“]”、第一个“]”以及第一个“]”之后的任何非字母的所有内容。

-e 's/\bon\b.*$//': 删除整个单词 "on" 直到行尾(如果存在)。

-e 's/\s*$//': 在上述处理后删除所有尾随空格。