说我有这个文件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列a和c:
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)
我也很好奇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)
你可以尝试下面的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)
为了获得所提到的格式,你需要传递的输出grep 到paste或任何其他命令.
$ 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)