繁体   English   中英

使用 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 的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM