我有一个包含多个 IP 的字符串。我需要使用 sed 将所有 IP 中的所有数字替换为字母“X”,10.135.1.03
即将变为XX.XXX.X.XX
.
UPDATE String 不仅包含 IP,还包含其他字符:字母和数字。只需要替换 IP 的数字。类似于“收到来自 192.168.1.1 的 5 个连接,来自 10.0.0.1 的 26 个连接,总共 31 个 - 星期二,2012 年 9 月 20 日。消息 ID:212.132.15”。
$ 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}
这可能对你有用(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
就个人而言,我会发现这非常困难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