我有一个包含多个IP的字符串。我需要使用sed将所有IP中的所有数字替换为字母“X”,即10.135.1.03
将变为XX.XXX.X.XX
。
UPDATE 字符串不仅包含IP,还包含其他字符:字母和数字。需要仅替换IP的数字。类似于“收到来自192.168.1.1的5个连接,来自10.0.0.1的26个连接,总共31个 - 星期二,20.09.2012。消息ID:212.132.15”。
答案 0 :(得分: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
btw,tr
语法稍微清晰一点:
out=$(tr [:digit:] X <<< "$str")
使用bash时,甚至更干净:
out=${str//[0-9]/X}
答案 1 :(得分: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
答案 2 :(得分: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