使用grep匹配子字符串之间的所有组合

时间:2019-07-01 15:26:33

标签: grep

我有以下类似的管道字符串:

(string start..) Enzyme: "ENZA ENZB ENZD ENZE" (..string end)  
(string start..) Enzyme:"ENZA ENZC ENZD ENZF" (..string end) 
(string start..) Enzyme:"ENZO ENZC ENZD ENZE" (..string end)

我希望我的grep输出从“酶”开始到第二个双引号结尾的所有内容,而不管两个双引号之间的值或数量是多少(可以是1到20个酶,我不知道他们的价值观)。这些酶始终是大写字母alpha,但是如果不止一个,它们之间总是存在一个空格。

我尝试过:

grep -o "Enzyme: \"(.*)\"
grep -o "Enzyme: \"[A-Z]\"
grep -o "Enzyme: \"[:alpha:]\"
grep -o "Enzyme: \"*\"

,但是这些都不返回任何东西。我将不胜感激任何想法,以得到我想要的。谢谢!

4 个答案:

答案 0 :(得分:0)

这是检查Enzyme:,然后检查零个或多个空格,再检查",直到看到下一个"

使用-E标志:

grep -oE 'Enzyme:[[:space:]]*"[^"]+"'
Enzyme: "ENZA ENZB ENZD ENZE"
Enzyme:"ENZA ENZC ENZD ENZF"
Enzyme:"ENZO ENZC ENZD ENZE"

带有-P标志:

grep -oP 'Enzyme:\s*"[^"]+"'
Enzyme: "ENZA ENZB ENZD ENZE"
Enzyme:"ENZA ENZC ENZD ENZF"
Enzyme:"ENZO ENZC ENZD ENZE"

答案 1 :(得分:0)

grep -o 'Enzyme: ?"[^"]+"'

从字面上匹配Enzyme:,后跟一个可选空格,一个字面双引号,不是双引号和一个字面双引号。

答案 2 :(得分:0)

Grep始终输出整个比赛,包括您的对手'Enzyme:“'和'”' 要匹配anker,但在输出中将其省略,则必须使用带前缀的正向looklook和带有所需输出的postfix的posititveahead:

grep -oE "(?<=Enzyme:\")(.*)(?=\")"

用于测试: echo 'Enzyme:"enz3 enz6 enz12 enz19"' | grep -oP "(?<=Enzyme:\")(.*)(?=\")"

也就是说,在这种情况下,使用sed会容易得多: echo 'Enzyme:"enz3 enz6 enz12 enz19"' | sed -r "s/Enzyme:\"(.*)\"/\1/g"

s/find/replace/是sed的搜索和替换命令

答案 3 :(得分:0)

要使用grep执行此操作,您需要-o的GNU grep:

grep -o 'Enzyme: *"[^"]*"'

否则,请在每个UNIX框的任何shell中使用任何sed:

$ sed -n 's/.*\(Enzyme: *"[^"]*"\).*/\1/p' file
Enzyme: "ENZA ENZB ENZD ENZE"
Enzyme:"ENZA ENZC ENZD ENZF"
Enzyme:"ENZO ENZC ENZD ENZE"