2013-05-31 69 views
1

我有这样一行:使用SED替代字符串

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//\ 

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

谢谢。

+1

它的模式是什么?一切从“a8”?第n场? – fedorqui

+0

在a8之前删除所有内容,并在最后删除此部分:714a81 1 40937 –

+0

您是否总是拥有'a8'或可以有不同?还是仅仅为了这一行? – Jerry

回答

2

您可以使用正则表达式:

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

这将在陷入组返回你想要的部分。经测试here

+1

如果'x'后面跟着非数字字符,即'e1',这将失败。 – mart1n

+1

@ mart1n对,OP提到的十六进制,我忽略了。现在修复。谢谢! – Jerry

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 
+0

+1适合正确工作的正确工具。削减是为此目的而走的路。 – anubhava

0

你可以用这句话来整行匹配和捕捉到的字符串东盟纺织工业联合会x <hex> <hex>

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

这是假设x总是要切断字符串的其余部分的分隔符。

编辑

完整的命令来做到这一点的命令行:

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/" 
0

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

这正则表达式将匹配字符串"a8 ... fc",其中"..."可以是任何组合的十六进制字节(只有小写字母)和空格:

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

然后可以使用使用替换在相同的正则表达式:

/a8$1fc/ 

这里$1将与匹配中,括号之间([0-9a-f ]+)被取代。