如何使用将字符串作为参数传递给的另一个程序的输出来更改找到字符串的行?

如何使用将字符串作为参数传递给的另一个程序的输出来更改找到字符串的行?
$ cat sample.dmesg.log | sed -re 's/(READ block )([0-9]+)( on xvda3.*$)/\1\2\3 XXX/g'
[ 6031.953619] sysctl(20774): READ block 5285528 on xvda3 (32 sectors) XXX
[ 6031.954317] sysctl(20774): READ block 5285768 on xvda3 (8 sectors) XXX
[ 6031.954598] sysctl(20774): READ block 5285648 on xvda3 (120 sectors) XXX
[ 6031.954617] sysctl(20774): READ block 5285776 on xvda3 (24 sectors) XXX
[ 6031.955482] sysctl(20774): READ block 5285560 on xvda3 (88 sectors) XXX
[ 6031.955699] sysctl(20774): READ block 4473568 on xvda3 (8 sectors) XXX
[ 6031.955730] sysctl(20774): READ block 4473584 on xvda3 (16 sectors) XXX
[ 6031.955787] sysctl(20774): READ block 4749496 on xvda3 (224 sectors) XXX

对于每个输入行,我想用XXX运行命令的结果替换上面的内容./showblock NUMBER,其中NUMBER\2上面的(第二组),sed例如。 5285528

但我怎样才能找到、执行一个程序,然后同时替换/修改呢?

结果示例:

[ 6031.953619] sysctl(20774): READ block 5285528 on xvda3 (32 sectors) Path: /usr/lib64/libgpg-error.so.0.24.2

希望这可以使用相同的命令来完成sed;或其他一些命令?

如果有人知道如何重新表述这个问题,使其更加通用和有用,请这样做。

换句话说:如何在正则表达式/正则表达式匹配的中间执行外部程序?

答案1

尝试 perl:

perl -pe '
    s{(READ block) (\d+) (on xvda3.*$)}
     {join " ",$1, $2, $3, qx(./showblock $2)}e
' sample.dmesg.log

要删除尾随换行符,你可以这样做

     { chomp($out = qx(./showblock $2)); join " ", $1, $2, $3, $out }e

相关内容