我试图在一行中定位两个字符串。下面是示例行。
line1: xxxx yyyy time1-12 zzzz time2-13
line2: xxxx yyyy time1-14 zzzz time2-15
我正在使用下面的 grep 命令来实现这一点
grep -o -E 'time1-[0-9]*|time2-[0-9]*' timetest.txt
这给我的输出是
time1-12
time2-13
time1-14
time2-15
但是我想要这样
time1-12 time2-13
time1-14 time2-15
我在这里缺少什么?我可以使用 awk 还是 sed 来获得这个输出
最佳答案
使用 GNU awk 来匹配第三个参数():
$ awk 'match($0,/time1-[0-9]*/,a) && match($0,/time2-[0-9]*/,b) { print a[0], b[0] }' file
time1-12 time2-13
time1-14 time2-15
注意time1和time2可以任意顺序就行。对于其他 awk,您需要使用 substr() 来提取 match() 结果:
$ awk 'match($0,/time1-[0-9]*/) && (a=substr($0,RSTART,RLENGTH)) && match($0,/time2-[0-9]*/) { print a, substr($0,RSTART,RLENGTH) }' file
time1-12 time2-13
time1-14 time2-15
如果这 2 次总是以相同的顺序进行,那么使用 gawk 你可以这样做:
$ awk 'match($0,/(time1-[0-9]*).*(time2-[0-9]*)/,a) { print a[1], a[2] }' file
time1-12 time2-13
time1-14 time2-15
但是这只是对单独一行的简单替换,所以你也可以只使用 sed:
$ sed -r 's/.*(time1-[0-9]*).*(time2-[0-9]*).*/\1 \2/' file
time1-12 time2-13
time1-14 time2-15
关于unix - 在一行中 Grep 多个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33148292/