我有一个包含三种行的文件:
[ ] APPLE
[ORANGE ] * ORANGE on XXXXXXXXXXXXXXX
[YELLOW ] + BANANA on XXXXXXXXXXXXXXX
我现在要做的是提取如下的水果名称:
APPLE
ORANGE
BANANA
在我意识到线的长度可能不同之前,我尝试用echo ${line:start:end}
提取它。所以我想我必须用模式匹配来做。
我是bash的新手,我应该如何使用sed / awk或其他任何方式提取水果名称?
谢谢!
答案 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