我有一些带有 ip 的文本。我想更换每个数字在 ip 中,后面没有带有其他字符的“SpecialWord”。每行可以有多个 ip。
例如:
此输入
*random text with different numbers* 255.43.23.8 *some more text* "SpecialWord" 32.123.21.44 *text again*
必须成为
*random text with different numbers* aaa.aa.aa.a *some more text* "SpecialWord" 32.123.21.44 *text again*
我尝试使用
sed -r 's/([0-9]{1,3}\.){3}[0-9]{1,3}/.../g'
但我不知道 ip 中的确切位数,并且 sed 无法执行前瞻操作。这里有什么可以帮助我?
答案1
我不确定 regexp 能否记住模式的长度,因此对于纯(部分)sed 解决方案:
编辑:
这有点棘手。
我想出了一个 sed 文件 a.sed
p
s/[0-9]\.[0-9]/a.a/g
s/with/phase 1/
p
s/[0-9]a\.a/aa.a/g
s/a\.a[0-9]/a.aa/g
s/phase 1/phase 2/
p
s/[0-9]aa.a/aaa.a/g
s/a.aa[0-9]/a.aaa/g
s/phase 2/final/
这基本上与命令行相同,但使用调试行。
- 第一行( - 第一行变成
1.2
(a.a
请注意文本中的数字,例如1.12%
将变成a.a2%
) - 下一行构建了两位和三位数的 IP。) 变成
1.2
(a.a
请注意文本中的数字,例如1.12%
将变成a.a2%
) - 接下来的几行是两位数和三位数的 IP。
- 确定后删除
p
和行s/phase x/../
使用
sed -f a.sed u
哪里u
是(是的,这不是有效的 IP,但这也不是重点)
*random text with different numbers* 255.43.23.8 *some more text* "SpecialWord" 32.123.21.44 *text again*
*random text with different 12* 255.4.2.8 *some more text* "SpecialWord" 32.12.21.44 *text again*
*random text with different 13* 255.453.263.788 *some more text* "SpecialWord" 2.123.21.454 *text again*
*random text with different 1.12%* 255.43.23.8 *some more text* "SpecialWord" 32.123.21.44 *text again*
*random text with different numbers* 5.43.23.8 *some more text* "SpecialWord" 32.3.1.44 *text again*
这将导致
*random text final different numbers* aaa.aa.aa.a *some more text* "SpecialWord" aa.aaa.aa.aa *text again*
*random text final different 12* aaa.a.a.a *some more text* "SpecialWord" aa.aa.aa.aa *text again*
*random text final different 13* aaa.aaa.aaa.aaa *some more text* "SpecialWord" a.aaa.aa.aaa *text again*
*random text final different a.aa%* aaa.aa.aa.a *some more text* "SpecialWord" aa.aaa.aa.aa *text again*
*random text final different numbers* a.aa.aa.a *some more text* "SpecialWord" aa.a.a.aa *text again*
编辑2: 如果你能负担得起临时文件
grep -Eo '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' u > v
获取 IP 列表v
sed s/[0-9]/a/g v > w
转向匿名IPw
paste -d '/' v w | sed -e 's|^.*$|s/&/|'
生成一个 sed 文件,将 IP 转换为匿名 IP ...
paste -d '/' v w | sed -e 's|^.*$|s/&/|' | sed -f - u
...并应用于文件。
结果与上面相同,除了 1.12% 的线
*random text with different 1.12%* aaa.aa.aa.a *some more text* "SpecialWord" aa.aaa.aa.aa *text again*
假设你有临时文件,并且喜欢用巡航导弹杀死兔子。
答案2
无条件更换IP可以通过以下方式完成:
perl -pe 's!(\d+(\.\d+){3})! $1 =~s/\d/a/gr !ge'
解释:用 (用“a”替换数字) 的结果替换 IP
为了保护“SpecialWord”之后的IP,请用“#”标记IP(并在最后将其删除)
perl -pe 's/"SpecialWord"\s*\d+/$&#/;
.....
s/#//'
全部一起:
perl -pe 's/"SpecialWord"\s*\d+/$&#/;
s!(\d+(\.\d+){3})! $1 =~s/\d/a/gr !ge;
s/#//' file