2013-03-26 124 views
0

我已經能夠通過awk print $ 2,sed [a-z]等來完成這件事,但是我怎麼會一次通過sed完成一個流?sed - 如何從第二列刪除A-Z

host_192.168.0.100 host_192.168.0.100 

假作

host_192.168.0.100 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 

謝謝!

回答

1

鑑於第二個例子,似乎要刪除所有的第一個空格之後出現非數字,邏輯上在第一位數字之前。你需要它去除破折號,下劃線,甚至點,以及字母;任何不是數字的東西。這表明:

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和其他此類材料;它會查找並記住數字和點的序列(以數字開頭和結尾),後面跟着一個非數字,非點號字符和其他任何尾隨材料,用記住的數字和點串替換它。這不太可能需要調整。

+0

這是迄今爲止最好的結果,但是某些未被選中還沒有。我添加了幾個例子(主要數字,培訓信件等)。認爲你可以處理它? :) – Numpty 2013-03-27 11:29:02

+0

你怎麼能夠將sed命令限制在第二列?如果你能詳細說明,我可以進一步清理它 – Numpty 2013-03-27 12:16:51

+0

看起來不錯,謝謝喬納森(特別是對於解釋) – Numpty 2013-03-27 14:32:08

1

試試這個:

sed 's/^\([^ ]*\) [a-z_-]*\(.*\)/\1 \2/i' 

編輯:更新以反映變更的要求。

1

一個簡單的方法可以工作:

sed 's/ [A-Za-z_]*/ /' 

例子:

$ sed 's/ [A-Za-z_]*/ /' <<<'host_192.168.0.100 host_192.168.0.100' 
host_192.168.0.100 192.168.0.100 
+0

這似乎比Ansgar發佈的更好,但是如果有連字符,前面的字符不會被捕獲。例如: ab-ab -abababab-ABABABAB-000.000.000.0 變成-ab-abababab-ABABABAB-000.000.000.0 – Numpty 2013-03-26 18:47:37

+0

我需要它們*全部*刪除:) – Numpty 2013-03-26 18:48:27

+1

嘗試替換'[A-Za-z_ ]'用'[^ 0-9。]'應該刪除一切到前面的數字。 – William 2013-03-26 19:11:12