我正在寻找一种在bash中执行以下操作的方法:
指定输入文件(JSON)
将每一行写入一个新文件(行可以受限于Regex模式,但不是必需的)
在文件
在之前的尝试中,我尝试使用简单的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:虽然输入文件类似于我的真实场景,但这个例子只是为了让你有所了解而被选中。
答案 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,因为问题中已经说过,如果我自己这样做,我会使用脚本语言。