1

我有这样的一行:

 22.665774 Fr RMSG  0 0 1 1 18 11 Rx 0 308002 5  20  1d6 x 20 20 a8 4f 35 40 1b 00 0f 08 f7 89 ff fa ff f3 35 80 49 00 00 00 00 30 00 00 80 ab 4b 54 40 f0 00 fc 714a81  1  40937

我想解析它并以这种方式替换它以获得仅这部分:

a8 4f 35 40 1b 00 0f 08 f7 89 ff fa ff f3 35 80 49 00 00 00 00 30 00 00 80 ab 4b 54 40 f0 00 fc

此刻我正在使用这个:

sed -re \"s/^.+x//\

但这只是给我 x 之前的部分。你能给我一些提示吗?

谢谢 。

4

4 回答 4

2

你可以使用这个正则表达式:

\sx\s(?:[0-9a-f]{2}\s){2}(.*?)\s\w{3,}

这将返回您想要在捕获组中的部分。在这里测试。

于 2013-05-31T11:32:11.657 回答
0

一定要sed吗?cut做得很完美。

echo '22.665774 Fr RMSG  0 0 1 1 18 11 Rx 0 308002 5  20  1d6 x 20 20 a8 4f 35 40 1b 00 0f 08 f7 89 ff fa ff f3 35 80 49 00 00 00 00 30 00 00 80 ab 4b 54 40 f0 00 fc 714a81  1  40937' | cut -d' ' -f22-53
于 2013-05-31T11:29:25.177 回答
0

您可以使用此表达式匹配整行并捕获字符串 aftex x <hex> <hex>

.*?\sx\s\w*?\s\w*?\s(.*?)\s\w{4,}.*

这假定 thex始终是您要截断字符串其余部分的分隔符。

编辑

在命令行上执行此操作的完整命令:

echo " 22.665774 Fr RMSG  0 0 1 1 18 11 Rx 0 308002 5  20  1d6 x 20 20 a8 4f 35 40 1b 00 0f 08 f7 89 ff fa ff f3 35 80 49 00 00 00 00 30 00 00 80 ab 4b 54 40 f0 00 fc 714a81  1  40937" | perl -pe "s/.*?\sx\s\w*?\s\w*?\s(.*?)\s\w{4,}.*/\1/"
于 2013-05-31T11:35:55.870 回答
0

我不熟悉 sed 但这适用于一般的正则表达式情况:

"a8 ... fc"此正则表达式将匹配"..."可以是十六进制字节(仅小写字母)和空格的任意组合的字符串:

/a8([0-9a-f ]+)fc/

然后,您可以使用以下方法在同一个正则表达式中使用替换:

/a8$1fc/

此处$1将替换为括号之间的匹配项([0-9a-f ]+)

于 2013-05-31T11:36:49.730 回答