按模式查找线条,仅保留模式但保留不匹配的线条
Find lines by pattern, leave only pattern but leave unmatched lines as they are
所以有一个这样的输入文件res.txt
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]
使用,例如,
grep -o "0x[0-9a-f][0-9a-f][0-9a-f][0-9a-f]" res.txt
我可以获得我的文件名列表(没有 .values),这很好!
0x8001
0x8002
但仍希望所有其他与模式不匹配的行保留在原处,如下所示:
0x8001
channel 1: 123
channel 2: 234
channel 3: 345
0x8002
channel 1: 456
channel 2: 567
channel 3: 678
我对 sed 非常熟悉,但我找不到一种方法来做我想做的事情。
你可以使用 sed。
$ sed 's/.*\(0x[0-9a-f][0-9a-f][0-9a-f][0-9a-f]\).*//' file
0x8001
channel 1: 123
channel 2: 234
channel 3: 345
0x8002
channel 1: 456
channel 2: 567
channel 3: 678
我假设一行中只有一个像 0x8001
这样的十六进制字符串。
使用 gnu awk,您可以 use match
function 使用您的正则表达式:
awk 'match([=10=], /0x[0-9a-f][0-9a-f][0-9a-f][0-9a-f]/){[=10=]=substr([=10=],RSTART,RLENGTH)} 1' file
0x8001
channel 1: 123
channel 2: 234
channel 3: 345
0x8002
channel 1: 456
channel 2: 567
channel 3: 678
所以有一个这样的输入文件res.txt
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]
使用,例如,
grep -o "0x[0-9a-f][0-9a-f][0-9a-f][0-9a-f]" res.txt
我可以获得我的文件名列表(没有 .values),这很好!
0x8001
0x8002
但仍希望所有其他与模式不匹配的行保留在原处,如下所示:
0x8001
channel 1: 123
channel 2: 234
channel 3: 345
0x8002
channel 1: 456
channel 2: 567
channel 3: 678
我对 sed 非常熟悉,但我找不到一种方法来做我想做的事情。
你可以使用 sed。
$ sed 's/.*\(0x[0-9a-f][0-9a-f][0-9a-f][0-9a-f]\).*//' file
0x8001
channel 1: 123
channel 2: 234
channel 3: 345
0x8002
channel 1: 456
channel 2: 567
channel 3: 678
我假设一行中只有一个像 0x8001
这样的十六进制字符串。
使用 gnu awk,您可以 use match
function 使用您的正则表达式:
awk 'match([=10=], /0x[0-9a-f][0-9a-f][0-9a-f][0-9a-f]/){[=10=]=substr([=10=],RSTART,RLENGTH)} 1' file
0x8001
channel 1: 123
channel 2: 234
channel 3: 345
0x8002
channel 1: 456
channel 2: 567
channel 3: 678