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*$//'
:
在上述处理后删除所有尾随空格。
我有一个包含三种行的文件:
[ ] 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*$//'
:
在上述处理后删除所有尾随空格。