我有以下类似的管道字符串:
(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: \"*\"
,但是这些都不返回任何东西。我将不胜感激任何想法,以得到我想要的。谢谢!
答案 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"