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

时间:2015-04-27 02:51:04

标签: regex bash shell awk sed

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

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

我现在要做的是提取如下的水果名称:

APPLE
ORANGE
BANANA

在我意识到线的长度可能不同之前,我尝试用echo ${line:start:end}提取它。所以我想我必须用模式匹配来做。

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

谢谢!

4 个答案:

答案 0 :(得分:1)

尝试使用此sed

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

答案 1 :(得分:1)

使用带有扩展正则表达式grep-E标志的-o仅返回匹配位

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

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

已修改以匹配有问题的更改

答案 2 :(得分:1)

这涉及两个措辞的水果名称,如“star fruit”,但必须假设尾随垃圾(如果有的话)以“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*$//':    在完成上述处理后,删除任何尾随空格。

答案 3 :(得分:0)

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

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