按模式查找线条,只留下图案,但保留不匹配的线条

时间:2015-05-17 09:47:21

标签: regex awk sed grep pipeline

所以有一个像这样的输入文件res.txt

Lock

我有这样的模式

processing file 0x8001.values
channel 1: 123
channel 2: 234
channel 3: 345
processing file 0x8002.values
channel 1: 456
channel 2: 567
channel 3: 678

使用,例如,

0x[0-9a-f][0-9a-f][0-9a-f][0-9a-f]

我可以获取我的文件名列表(没有.values),这很好!

grep -o "0x[0-9a-f][0-9a-f][0-9a-f][0-9a-f]" res.txt

但仍然希望所有其他线条与模式不匹配,保持原样:

0x8001
0x8002

我对sed非常熟悉,但我找不到办法做我想做的事。

2 个答案:

答案 0 :(得分:1)

你可以使用sed。

$ sed 's/.*\(0x[0-9a-f][0-9a-f][0-9a-f][0-9a-f]\).*/\1/' file
0x8001
channel 1: 123
channel 2: 234
channel 3: 345
0x8002
channel 1: 456
channel 2: 567
channel 3: 678

我假设一行中只有一个十六进制字符串,如0x8001

答案 1 :(得分:1)

使用gnu awk,你可以使用你的正则表达式use match function这样:

awk 'match($0, /0x[0-9a-f][0-9a-f][0-9a-f][0-9a-f]/){$0=substr($0,RSTART,RLENGTH)} 1' file
0x8001
channel 1: 123
channel 2: 234
channel 3: 345
0x8002
channel 1: 456
channel 2: 567
channel 3: 678