使用 sed 替换行

Replace in line using sed

我正在创建一个 shell 脚本,它读取以下 list.log

1.15.2.119
1.15.86.33
1.15.251.60
1.20.178.145/31
1.37.33.24
1.54.202.216
1.58.10.126/28
1.80.225.84
1.116.240.174/30


我想在所有 IP 的末尾添加一个 /32 IP,除了那些已经存在的 /32 东西。

示例:

1.14.191.227/32
1.15.2.119/32
1.15.86.33/32
1.15.251.60/32
1.20.178.145/31
1.37.33.24/32
1.54.202.216/32
1.58.10.126/28
1.80.225.84/32
1.116.240.174/30


我的 return 是 /32

的两倍
cat list.log | sed 's/$/\/32/'

1.14.191.227/32
1.15.2.119/32
1.15.86.33/32
1.15.251.60/32
1.20.178.145/31/32
1.37.33.24/32
1.54.202.216/32
1.58.10.126/28/32
1.80.225.84/32
1.116.240.174/30/32

您可以在不包含 /

的行末添加 /32
sed  '\,/,!s,$,/32,' list.log > newlist.log

详情:

  • \,/,! - 查找不包含 /
  • 的行
  • s,$,/32, - 并用 /32 替换字符串位置的结尾。

参见 online demo:

#!/bin/bash
s='1.15.2.119
1.15.86.33
1.15.251.60
1.20.178.145/31
1.37.33.24
1.54.202.216
1.58.10.126/28
1.80.225.84
1.116.240.174/30'

sed  '\,/,!s,$,/32,' <<< "$s"

输出:

1.15.2.119/32
1.15.86.33/32
1.15.251.60/32
1.20.178.145/31
1.37.33.24/32
1.54.202.216/32
1.58.10.126/28
1.80.225.84/32
1.116.240.174/30

这可以在 awk 中轻松完成,请尝试遵循 awk 程序。使用显示的示例编写和测试。

awk '!/\/32$/{[=10=]=[=10=]"/32"} 1' Input_file

解释: 简单的解释是,如果行不以 /32 结尾则检查条件,然后添加 /32 到当前行并提及 1 将打印 edited/non-edited 当前行。

使用sed

$ sed 's|\.[0-9]\+$|&/32|' list.log
1.15.2.119/32
1.15.86.33/32
1.15.251.60/32
1.20.178.145/31
1.37.33.24/32
1.54.202.216/32
1.58.10.126/28
1.80.225.84/32
1.116.240.174/30