我有一个需要调整的文本文件,因此我可以将其输入数据库。
然而,文件的格式虽然一致,但在想要将它们放入表格时并不是真正的用法。
allow any 123.123.123.1,2,3 22,443
之后我需要的是像
allow any 123.123.123.1 22
allow any 123.123.123.1 443
allow any 123.123.123.2 22
allow any 123.123.123.2 443
allow any 123.123.123.3 22
allow any 123.123.123.3 443
因为Text文件很旧并且超过1000行(我想将它放入我们的数据库的原因之一),手动执行它会非常潮流。
使用sed,tr等文本处理工具有一个简短的方法吗?
答案 0 :(得分:3)
可以使用大括号扩展
printf "%s\n" "allow any 123.123.123."{1,2,3}" "{22,443}
allow any 123.123.123.1 22
allow any 123.123.123.1 443
allow any 123.123.123.2 22
allow any 123.123.123.2 443
allow any 123.123.123.3 22
allow any 123.123.123.3 443
可以使用perl生成并运行括号
perl -ne 's/[^\.\s]+,[,\S]+/{$&}/g;s/[^{}\n]+(?![^{]*})/"$&"/g;print `printf "%s\n" $_`' f
答案 1 :(得分:2)
我想出了一个Awk
脚本,如下所示,为你完成工作。
#!/usr/bin/awk
{
n1=split($3,arr1,".")
n2=split(arr1[n1],arr2,",")
n3=split($4,arr3,",")
k=arr1[1]"."arr1[2]"."arr1[3]
for(i=1;i<=n2;i++) {
for(j=1;j<=n3;j++) {
print $1,$2,k"."arr2[i],arr3[j]
}
}
}
将其放在名为script.awk
的文件中,并将其作为
awk -f awkscript.awk file
allow any 123.123.123.1 22
allow any 123.123.123.1 443
allow any 123.123.123.2 22
allow any 123.123.123.2 443
allow any 123.123.123.3 22
allow any 123.123.123.3 443
我们的想法是首先将$2
的内容拆分为.
以获取最后一部分1,2,3
,可以将其作为arr1[n]
访问,这意味着最后一个元素拆分后形成的数组。然后,逗号分隔的元素现在被,
拆分并存储在数组arr2
中,并以$4
记录的相同方式存储。创建变量k
只是为了将前三个元素存储在第一个split()
中,即仅123.123.123
现在在形成的数组元素上形成一个循环,以根据需要打印元素。
答案 2 :(得分:1)
只是为了sed的乐趣(GNU sed版本4.2.1):
sed -E -fallow.sed | sort
使用allow.sed:
s/^([^\n]+[^,[:digit:]])([[:digit:]]+(,[[:digit:]]+)*),([[:digit:]]+)([^\n]*)$/\1\2\5\n\1\4\5/;
:a;
s/^([^\n,]+[^,[:digit:]])([[:digit:]]+(,[[:digit:]]+)*),([[:digit:]]+)([^\n]*)\n(.*)$/\1\2\5\n\6\n\1\4\5/;
ta;
s/^([^,]+)\n(.*,.*)$/\2\n\1/;
ta;
输出:
allow any 123.123.123.1 22
allow any 123.123.123.1 443
allow any 123.123.123.2 22
allow any 123.123.123.2 443
allow any 123.123.123.3 22
allow any 123.123.123.3 443