对每行文本文件进行正则表达式操作,写入新文件

时间:2014-05-08 09:52:45

标签: regex bash awk terminal gawk

我正在寻找一种在bash中执行以下操作的方法:

  1. 指定输入文件(JSON)

  2. 将每一行写入一个新文件(行可以受限于Regex模式,但不是必需的)

  3. 在文件

  4. 中的特定JSON值之后命名每个文件

    在之前的尝试中,我尝试使用简单的split(没有命名部分)来执行任务,但是在一定数量的行之后退出。我最大的文件有大约1000行。

    示例输入:

    {
            "stuff":
            [
                { "data": "123", "filename": "abc.xml" },
                { "data": "456", "filename": "def.xml" },
                { "data": "789", "filename": "ghi.xml" }
           ]
    }
    

    示例输出:

    abc.xml的内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <data>123</data>
    

    def.xml的内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <data>456</data>
    

    PS:虽然输入文件类似于我的真实场景,但这个例子只是为了让你有所了解而被选中。

2 个答案:

答案 0 :(得分:1)

既然你说格式是固定的,这对你有用:

kent$  ls 
f


kent$  awk -F'"' '/data/{printf "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%s>%s</%s>\n", $2,$4,$2>$8; close($8) }' f

kent$  ls                                                                                                               
abc.xml  def.xml  f  ghi.xml

kent$  head *.xml
==> abc.xml <==
<?xml version="1.0" encoding="UTF-8"?>
<data>123</data>

==> def.xml <==
<?xml version="1.0" encoding="UTF-8"?>
<data>456</data>

==> ghi.xml <==
<?xml version="1.0" encoding="UTF-8"?>
<data>789</data>

答案 1 :(得分:0)

我认为awk是一种更好的方式,如果它是你想要的纯粹的bash,那么你可以试试这个:

➜  scripts  cat my_bash_example.sh
#!/bin/bash

while read -r variable; do
    if [[ "$variable" =~ .*\.xml ]]; then
        echo "making xmlfile"
        echo $variable;
        cat temp.tmp > $variable
    else
        echo "making tempfile"
        echo $variable
        echo $variable > temp.tmp
    fi
    done
➜  scripts  cat input.json | grep data | grep -oP '(?<=data": "|filename": ").*?(?=")' | my_bash_example.sh

我决定用它练习我的管道,grep和bash_scripts。虽然它有点丑陋(并且在很多情况下会中断)。我更喜欢awk。

哦,顺便说一句,我使用了bash,因为问题中已经说过,如果我自己这样做,我会使用脚本语言。

相关问题