使用sed提取多个匹配项

时间:2016-11-12 07:13:31

标签: sed

我有以下一行:

echo AS:i:0  UQ:i:0  ZZ:Z:mus.sup  NM:i:0  MD:Z:50  ZZ:Z:cas.sup  CO:Z:endOfLine|sed 's/.*\(ZZ:Z:.*[ ]\).*/\1/g'

输出:

ZZ:Z:cas.sup

我想使用sed从给定行中提取两个ZZ:Z条目,例如(请避免使用awk,因为ZZ:Z条目的位置可能因文件中的每一行而不同):

最好的输出:

ZZ:Z:mus.sup  ZZ:Z:cas.sup 

或者可能:

ZZ:Z:mus.sup  
ZZ:Z:cas.sup 

感谢。

2 个答案:

答案 0 :(得分:1)

你可以通过sed来实现它,但不会trgrep解决方案更自然(因为你似乎实际上有不同的逻辑记录,尽管它们实际上是出现在一行上):

echo AS:i:0  UQ:i:0  ZZ:Z:mus.sup  NM:i:0  MD:Z:50  ZZ:Z:cas.sup  CO:Z:endOfLine | tr ' ' '\n' | grep "ZZ:Z"

如果您想将所有内容放回一行,只需在末尾添加| tr '\n' ' '即可将\n转换回空格。

当然,您也可以在此解决方案中将grep替换为sed

答案 1 :(得分:1)

使用grep(或-o)标记试试--only-matching

$ grep -o 'ZZ:Z:[^ ]* ' <<< "AS:i:0  UQ:i:0  ZZ:Z:mus.sup  NM:i:0  MD:Z:50  ZZ:Z:cas.sup  CO:Z:endOfLine"
ZZ:Z:mus.sup 
ZZ:Z:cas.sup

sed,基于此@potong answer

sed 's/ZZ:Z:/\n&/g;s/[^\n]*\n\(ZZ:Z:[^ ]* \)[^\n]*/\1 /g;s/.$//'

如果每行只出现两次模式:

sed -n 's/.*\(ZZ:Z[^ ]*\).*\(ZZ:Z[^ ]*\).*/\1 \2/p' <<< "AS:i:0  UQ:i:0  ZZ:Z:mus.sup  NM:i:0  MD:Z:50  ZZ:Z:cas.sup  CO:Z:endOfLine"