2012-09-19 82 views
1

我有一個包含多個IP的字符串。我需要使用sed將所有IP中的所有數字替換爲字母'X',即10.135.1.03將變爲XX.XXX.X.XX使用sed替換IP地址的數字(保留字符數)

UPDATE字符串不僅包含IP,還包含其他字符:字母和數字。只需要替換IP的數字。例如「從192.168.1.1接收到5個連接,從10.0.0.1接收到26個連接,總計31 - 2012年9月20日星期二。MessageID:212.132.15」。

回答

3
$ str="10.135.1.03" 
$ echo $str | sed -e "s/[0-9]/X/g" 
XX.XXX.X.XX 

或腳本背景下,這可能是更好:

out=$(sed -e "s/[0-9]/X/g" <<< "$str") 

不知道你爲什麼想sed順便說一句,tr有一個稍微清晰的語法:

out=$(tr [:digit:] X <<< "$str") 

使用bash時,更清潔:

out=${str//[0-9]/X} 
+0

不幸的是我的字符串連續除了IP之外,還有其他的字符:字母和數字。只需要替換IP的數字。 –

+0

@JohnDoe,是否有迫切需要用一個X替換每個字符,還是我們可以用X替換123,使所有IP的X.X.X.X? – mvds

+0

是的,我們需要保留字符的數量,一個數字一個X. –

1

就個人而言,我會發現sed非常困難。我認爲這將是與GNU awk容易得多:

awk --re-interval '{ for (i=1; i<=NF; i++) if ($i ~ /([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}/) gsub(/[[:digit:]]/, "X", $i) }1' file.txt 

結果:

Received 5 connections from XXX.XXX.X.X, 26 connections from XX.X.X.X, total 31 - Tuesday, 20.09.2012. MessageID: 212.132.15 
1

這可能會爲你(GNU的sed,TR和Bash)工作:

sed -r 's/\<[0-9]{1,3}(\.[0-9]{1,3}){3}\>/$(tr [0-9] X <<<&)/g;s/.*/echo &/e' file 

你能欺騙並做:

sed -r 's/\<[0-9]{1,3}(\.[0-9]{1,3}){3}\>/X.X.X.X/g' file