如何使用grep提取多个组

usu*_* me 4 regex grep pcre

说我有这个文件data.txt:

a=0,b=3,c=5
a=2,b=0,c=4
a=3,b=6,c=7
Run Code Online (Sandbox Code Playgroud)

我想用grep提取对应的值2列ac:

0 5
2 4
3 7
Run Code Online (Sandbox Code Playgroud)

我知道如何分别提取每个列:

grep -oP 'a=\K([0-9]+)' data.txt
0
2
3
Run Code Online (Sandbox Code Playgroud)

和:

grep -oP 'c=\K([0-9]+)' data.txt
5
4
7
Run Code Online (Sandbox Code Playgroud)

但我无法想象如何提取这两组.我尝试了以下,但没有用:

grep -oP 'a=\K([0-9]+),.+c=\K([0-9]+)' data.txt
5
4
7
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 7

我也很好奇grep能够这样做。\K“删除”先前存储的内容,因此您不能在同一个表达式中使用它两次:它只会显示最后一组。因此,它应该以不同的方式进行。

同时,我会使用sed

sed -r 's/^a=([0-9]+).*c=([0-9]+)$/\1 \2/' file
Run Code Online (Sandbox Code Playgroud)

之后抓住数字a=c=,每当发生这种情况在开始用线条a=和不含有后别的c=digits

对于您的输入,它返回:

0 5
2 4
3 7
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案。 (2认同)

Avi*_*Raj 5

你可以尝试下面的grep命令.但请注意,grep会在单独的新行中显示每个匹配项.因此,您将无法获得问题中提到的格式.

$ grep -oP 'a=\K([0-9]+)|c=\K([0-9]+)' file
0
5
2
4
3
7
Run Code Online (Sandbox Code Playgroud)

为了获得所提到的格式,你需要传递的输出greppaste或任何其他命令.

$ grep -oP 'a=\K([0-9]+)|c=\K([0-9]+)' file | paste -d' ' - -
0 5
2 4
3 7
Run Code Online (Sandbox Code Playgroud)