2016-05-14 38 views
10

我試圖找出如何做的sed如下:格式IP與SED

我的IPv4地址的列表,我試圖讓他們顯示器的所有統一。舉例來說:1.2.4.32將是001.002.004.03210.125.62.1將是010.125.062.001

我想用sed來做,因爲這就是我現在正在學習的東西。

我得到了這兩個,它將採取任何一個或兩個數字的數字,並在前面追加零。

sed 's/\<[0-9][0-9]\>/0&/g' file 
sed 's/\<[0-9]\>/00&/g' file 

但運行到我的輸入文件將在其他非IP地址的地方有單或雙位數的數字更實際的問題。例如:

host-1 1.2.3.32 

所以我需要爲它尋找完整的IP地址,而且我認爲他可以通過這個

sed 's/\.\<[0-9]\>/00&/g' 

來實現,但是不僅是無視1.something.something.something的情況下的一種方式,但由於某種原因,它在第3個八位字節的末尾附加了00

echo "10.10.88.5" | sed 's/\.\<[0-9]\>/00&/g' 
10.10.8800.5 

示例文件:

Jumpstart Server jumo  10.20.5.126 
Jumpstart Server acob  10.20.5.168 
NW1 H17 Node cluster  10.10.161.87 
NW1 H17 Node-1  10.10.161.8 
NW1 H17 Node-2  10.10.161.9 
ts-nw1  10.10.8.6 
+0

該文件的內容是否有模式?從文件中發佈摘錄 – sjsam

+0

按要求提供。文件 –

+0

謝謝,這使得問題更加清楚:) – sjsam

回答

3
$ cat 37222835.txt 
Jumpstart Server jumo  10.20.5.126 10.29.23.24 
Jumpstart Server acob  10.20.5.168 dig opt 
Jumpstart Server reac  251.218.212.1 rel 
NW1 H17 Node cluster  10.10.161.87 
NW1 H17 Node-1  10.10.161.8 
NW1 H17 Node-2  10.10.161.9 
ts-nw1  10.10.8.6 
Nw2 HW12 Node-3  192.168.0.1 
cluster 

這樣做:

sed -n 's/\([1]\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)\{1\}\.'\ 
'\([1]\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)\{1\}\.'\ 
'\([1]\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)\{1\}\.'\ 
'\([1]\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5] \)/00\1\.00\2\.00\3\.00\4/g; 
s/0\+\([0-9]\{3\}\)/\1/g;p' 37222835.txt 

給出:

Jumpstart Server jumo  010.020.005.126 010.029.023.024 
Jumpstart Server acob  010.020.005.168 dig opt 
Jumpstart Server reac  251.218.212.001 rel 
NW1 H17 Node cluster  010.010.161.087 
NW1 H17 Node-1  010.010.161.008 
NW1 H17 Node-2  010.010.161.009 
ts-nw1  010.010.008.006 
Nw2 HW12 Node-3  192.168.000.001 
cluster 

優勢通過@本傑明-W

這可以在同一個替代多個IP地址中提到的方法行

缺點(由@本傑明-W補救提到的方法這一點)

本來是有說一句話Node-000234將它改爲Node-234。事實上,你可以使用第二個替換命令來獲得所需的行爲。

+0

謝謝@sjsam,這完美無缺。 –

+0

@ D.Zou:介意我最後提到的東西:) – sjsam

+0

@sjsam優勢2號現在不在了;) –

5

改變一行只有部分的慣用方式是將它複製到保留空間,除去我們不是從感興趣的部分模式空間,獲取保留空間,然後重新排列模式空間以替換我們用新版本更改的部分。

這應該工作(與-E的BSD sed的替換-r):

sed -r 'h     # Copy pattern space to hold space 

# Remove everything except IP address from pattern space 
s/.*\b(([0-9]{1,3}\.){3}[0-9]{1,3})\b.*/\1/ 

s/([0-9])+/00&/g   # Prepend '00' to each group of digits 
s/[0-9]*([0-9]{3})/\1/g # Only retain last three digits of each group 
G       # Append hold space to pattern space 

# Replace old IP with new IP 
s/(.*)\n(.*)\b([0-9]{1,3}\.){3}[0-9]{1,3}\b(.*)/\2\1\4/' infile 

的最後一步是最複雜的一個。之前只是它,一行看起來像這樣(換行符爲\n,行尾爲$):

010.020.005.126\nJumpstart Server jumo  10.20.5.126$ 

即,我們的新的和改進的IP地址,一個換行符,那麼完整的舊線。現在我們捕捉下劃線組:

010.020.005.126\nJumpstart Server jumo  10.20.5.126$ 
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^   ^
     (.*)  \n   (.*)    \b...\b (.*) 
     \1     \2     \3  \4 

,並通過使用2組重排線,然後組1(我們的新IP)和4.注意

  • 有四個捕捉組,但第三個是幫助描述一個IP地址,我們實際上並不想保留它,因此代替\2\1\4(在sed中沒有非捕獲組)。
  • 最後一個捕獲組(在IP地址後面)是空的,但讓它可以用於具有任何IP地址的線路。
  • 這隻會替換每行上的第一個IP地址,以防有多個IP地址。

整體輸出是

Jumpstart Server jumo  010.020.005.126 
Jumpstart Server acob  010.020.005.168 
NW1 H17 Node cluster  010.010.161.087 
NW1 H17 Node-1  010.010.161.008 
NW1 H17 Node-2  010.010.161.009 
ts-nw1  010.010.008.006 

同爲一個牢固不可讀一行程序:

sed -r 'h;s/.*\b(([0-9]{1,3}\.){3}[0-9]{1,3})\b.*/\1/;s/([0-9])+/00&/g;s/[0-9]*([0-9]{3})/\1/g;G;s/(.*)\n(.*)\b([0-9]{1,3}\.){3}[0-9]{1,3}\b(.*)/\2\1\4/' infile 

\b是GNU擴展。劇本大多沒有它的作品;使用它可確保blah1.2.3.4blah不受影響。

+1

@cyrus oops ...就這樣! –

+1

@cyrus那裏。 's/[0-9]([0-9] {3})/ \ 1/g'必須是s/[0-9] *([0-9] {3})/ \ 1/g'。我的內部質量保證非常重要! ;) –

+0

'-E'實際上在GNU sed上工作,只是沒有記錄。 – andlrc