2013-05-31 71 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 ]+)被取代。