鑑於第二個例子,似乎要刪除所有的第一個空格之後出現非數字,邏輯上在第一位數字之前。你需要它去除破折號,下劃線,甚至點,以及字母;任何不是數字的東西。這表明:
sed -e 's/ [^0-9]*/ /'
這是相當簡約,但滿足您的條件:
$ cat data
host_192.168.0.100 host_192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 ab-ab-abababab-ABABABAB-000.000.000.0
$ sed -e 's/ [^0-9]*/ /' data
host_192.168.0.100 192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 000.000.000.0
$
技能的編寫好的正則表達式的很大一部分是寫你想要的正則表達式一個很好的說明實際上做到了(對於正則表達式來說是有意義的)。
的三個新項目與領先的數字和字母,以及尾隨材料,大大複雜化生活:
$ cat data
host_192.168.0.100 host_192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 ab-ab-abababab-ABABABAB-000.000.000.0
01-admin-10.10.10.10 01-admin-10.10.10.10
10.10.10.10-NAT 10.10.10.10-NAT
1test-10.10.10.10 1test-10.10.10.10
$ sed -e 's/ [^0-9]*/ /' \
> -e 's/ [^.]*-\([0-9][0-9.]*[0-9]\)/ \1/' \
> -e 's/ \([0-9][0-9.]*[0-9]\)[^0-9.].*$/ \1/' data
host_192.168.0.100 192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 000.000.000.0
01-admin-10.10.10.10 10.10.10.10
10.10.10.10-NAT 10.10.10.10
1test-10.10.10.10 10.10.10.10
$
的sed
腳本獲得3個獨立的清洗表達式。第一個和以前一樣,在空格後立即刪除任何非數字。這不太可能需要調整。
雖然01-admin-
行沒有被觸及;第二個正則表達式通過尋找一個空白,一系列非點和一個破折號,然後捕獲一個以一個數字開始的序列,繼續交錯的數字和點,並以一個數字結尾來處理,替換爲記住的數字和點的字符串。匹配破折號是理想工作的關鍵;如果你不小心,*
太貪婪(因此,例如,s/ .*\([0-9][0-9.]*[0-9]\)/\1/
吞掉了IP地址組件的前幾位數字)。我假設sed
沒有非貪婪的量詞,如*?
;如果你的版本有問題,你可能會想出不同的答案(但這個版本也可以)。您可能需要調整該模式以處理其他特殊情況;請爲自己做,而不是編輯這個問題。
第三個正則表達式涉及尾部-NET
和其他此類材料;它會查找並記住數字和點的序列(以數字開頭和結尾),後面跟着一個非數字,非點號字符和其他任何尾隨材料,用記住的數字和點串替換它。這不太可能需要調整。
這是迄今爲止最好的結果,但是某些未被選中還沒有。我添加了幾個例子(主要數字,培訓信件等)。認爲你可以處理它? :) – Numpty 2013-03-27 11:29:02
你怎麼能夠將sed命令限制在第二列?如果你能詳細說明,我可以進一步清理它 – Numpty 2013-03-27 12:16:51
看起來不錯,謝謝喬納森(特別是對於解釋) – Numpty 2013-03-27 14:32:08