使用sed提取多个匹配项

使用sed提取多个匹配项,sed,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:m

我有以下几行:

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 

谢谢。

您当然可以使用
sed
实现它,但是
tr
grep
解决方案不是更自然吗(因为您似乎实际上拥有不同的逻辑记录,尽管它们出现在一行上):

如果您想将所有内容都返回到一行中,只需在末尾添加
|tr'\n'
,以便将返回的
\n
转换为空格


当然,您也可以在这个解决方案中用
sed
替换
grep

您当然可以用
sed
实现它,但是
tr
grep
解决方案不是更自然吗(因为您似乎实际上拥有不同的逻辑记录,尽管它们出现在一行上):

如果您想将所有内容都返回到一行中,只需在末尾添加
|tr'\n'
,以便将返回的
\n
转换为空格


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

尝试
grep
,使用
-o
(或
--仅匹配
)标志:

如果每行仅出现两次阵列:

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" 

sed-n's/*\(ZZ:Z[^]*\).\(ZZ:Z[^]*\)./\1\2/p'使用
-o
(或
-仅匹配
)标志尝试
grep

如果每行仅出现两次阵列:

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" 

sed-n的/*\(ZZ:Z[^]*\).\(ZZ:Z[^]*\)./\1\2/p'如果有人能提出sed解决方案以避免管道,并作为将来的参考,将不胜感激。。。我希望看到一个sed解决方案,可以实现单词边界(\b)的使用。因此,允许获取在ZZ:Z之后但在下一个右边界之前的所有内容。例如:\bZZ:Z:.*\b但我无法理解正确的sed语法…如果有人能提出sed解决方案以避免管道,并作为将来的参考,我将不胜感激。。。我希望看到一个sed解决方案,可以实现单词边界(\b)的使用。因此,允许获取在ZZ:Z之后但在下一个右边界之前的所有内容。例如:\bZZ:Z:.*\b但我无法理解正确的sed语法…#Kenavoz:1。sed解决方案对我不起作用(至少在Mac的终端上不起作用)。有没有一种方法可以使[grep-o]解决方案将每行的输出变成同一行中的两个输出?例如:ZZ:Z:mus.sup ZZ:Z:cas.sup请避免使用“tr”的管道解决方案,例如:grep-o'ZZ:Z:[^]*“|tr'\n”“”,因为此解决方案在一行中输出多行文件中的所有ZZ:Z匹配项。理想的解决方案是:成对的ZZ:Z匹配-例如:ZZ:Z:mus.sup ZZ:Z:cas.sup在每行中。因此,从每行中收集所有ZZ:Z:并在一行中呈现#Kenavoz:1。sed解决方案对我不起作用(至少在Mac的终端上不起作用)。有没有一种方法可以使[grep-o]解决方案将每行的输出变成同一行中的两个输出?例如:ZZ:Z:mus.sup ZZ:Z:cas.sup请避免使用“tr”的管道解决方案,例如:grep-o'ZZ:Z:[^]*“|tr'\n”“”,因为此解决方案在一行中输出多行文件中的所有ZZ:Z匹配项。理想的解决方案是:成对的ZZ:Z匹配-例如:ZZ:Z:mus.sup ZZ:Z:cas.sup在每行中。因此,从每行中收集所有ZZ:Z:并在一行中呈现
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"