Regex 使用sed获取文件的IPv4地址并使用前缀导出
我有一个文件iplist.txt,内容如下:Regex 使用sed获取文件的IPv4地址并使用前缀导出,regex,bash,sed,Regex,Bash,Sed,我有一个文件iplist.txt,内容如下: 1.2.3.4 127.0.0.1 192.168.1.0/24 1111:2222:3333:4444:: 5.6.7.8 我正在试图找到一种方法,在不使用IPv6的情况下导出一个新文件,并且每行都带有前缀,类似于: exportediplist.txt /ip add address=1.2.3.4 /ip add address=127.0.0.1 /ip add address=192.168.1.0/24 /ip add address=
1.2.3.4
127.0.0.1
192.168.1.0/24
1111:2222:3333:4444::
5.6.7.8
我正在试图找到一种方法,在不使用IPv6的情况下导出一个新文件,并且每行都带有前缀,类似于:
exportediplist.txt
/ip add address=1.2.3.4
/ip add address=127.0.0.1
/ip add address=192.168.1.0/24
/ip add address=5.6.7.8
我尝试做的第一件事是添加一个前缀:
originalfile=/somepath/iplist.txt
exportedfile=/somepath/exportediplist.txt
sed -e 's#^#/ip add address=#' $originalfile > $exportedfile
它工作正常,但我不知道如何从文件中删除IPv6。使用sed并不重要,只要是与debian一起工作的任何东西。对于GNU
sed
,您可以使用
sed -En '/([0-9]+\.){3}[0-9]+/{s,,/ip add address=&,p}' $originalfile > $exportedfile
或者,使用更精确的表达式来匹配整个类似IPv4的线路:
sed -En '/^([0-9]+\.){3}[0-9]+(\/[0-9]+)?$/{s,,/ip add address=&,p}' $originalfile > $exportedfile
见和
详细信息
--En
启用POSIX ERE语法,而E
抑制默认行输出n
-查找以点分隔的4个数字的所有行/([0-9]+\){3}[0-9]+/
是相同的,但另外检查字符串的开头(/^([0-9]+\){3}[0-9]+(\/[0-9]+)?$/
)和结尾(^
),并且还将$
//code>之后的可选端口号与
匹配(\/[0-9]+)?
-在找到的行上,将匹配项替换为s,,/ip add address=&,
+匹配值/ip add address=
-打印结果p
grep/sed
组合:
$ egrep -v ':' iplist.txt | sed 's|^|/ip add address=|g'
/ip add address=1.2.3.4
/ip add address=127.0.0.1
/ip add address=192.168.1.0/24
/ip add address=5.6.7.8
使用sed的另一个想法是:
$ sed '/:/d;s|^|/ip add address=|g' iplist.txt
/ip add address=1.2.3.4
/ip add address=127.0.0.1
/ip add address=192.168.1.0/24
/ip add address=5.6.7.8
其中:
-跳过/删除包含冒号的任何行(/:/d
):
-用所需字符串在其余行的前面加上前缀s| ^ | ip add address'| g
awk
idea:
$ awk '/:/ { next } { printf "/ip add address=%s\n", $0}' iplist.txt
/ip add address=1.2.3.4
/ip add address=127.0.0.1
/ip add address=192.168.1.0/24
/ip add address=5.6.7.8
一个非常简单的单行程序
awk
:
awk'!/:/{print”/ip add address=“$0}”infle>outfile
工作原理:
!/:/代码>:如果不包含冒号字符,请选择要处理的行
:通过添加新前缀填充来处理行{print”/ip add address=“$0}