* nix方式在','之后乘以线

时间:2017-04-20 14:07:24

标签: linux bash unix sed tr

我有一个需要调整的文本文件,因此我可以将其输入数据库。

然而,文件的格式虽然一致,但在想要将它们放入表格时并不是真正的用法。

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等文本处理工具有一个简短的方法吗?

3 个答案:

答案 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