替换匹配行中的字符

替换匹配行中的字符

我有一些带有 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.2a.a请注意文本中的数字,例如1.12%将变成a.a2%
  • 下一行构建了两位和三位数的 IP。) 变成1.2a.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

相关内容