[英]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 的 IP。
例子:
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
我的回报是 /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
这可以在awk
中轻松完成,请尝试以下awk
程序。 使用显示的示例编写和测试。
awk '!/\/32$/{$0=$0"/32"} 1' Input_file
解释:简单的解释是,如果行不以/32
结尾则检查条件,然后将/32
添加到当前行并提及1
将打印已编辑/未编辑的当前行。
使用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
您可以将/32
添加到不包含/
的行的末尾
sed '\,/,!s,$,/32,' list.log > newlist.log
详情:
\,/,!
- 查找不包含/
的行s,$,/32,
- 并用/32
替换字符串 position 的结尾。请参阅在线演示:
#!/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"
Output:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.