![Bash 脚本逐行读取文档并在同一文档中创建具有预定义文件名的多个文档](https://linux22.com/image/160788/Bash%20%E8%84%9A%E6%9C%AC%E9%80%90%E8%A1%8C%E8%AF%BB%E5%8F%96%E6%96%87%E6%A1%A3%E5%B9%B6%E5%9C%A8%E5%90%8C%E4%B8%80%E6%96%87%E6%A1%A3%E4%B8%AD%E5%88%9B%E5%BB%BA%E5%85%B7%E6%9C%89%E9%A2%84%E5%AE%9A%E4%B9%89%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E5%A4%9A%E4%B8%AA%E6%96%87%E6%A1%A3.png)
我有一个包含信息列表的文件,如下所示:
#FILENAME "Some name - some title.xml"
<song>some song</song>
<year>1994.</year>
<album>Some album</album>
<artist>some artist</artist>
#FILENAME "another filename - some have ' in title title.xml"
<song>another song</song>
<year>1996.</year>
<album>another album</album>
<artist>another artist</artist>
#FILENAME "yet another filename - something.xml"
...
..
.
超过 25 000 行,我需要创建单独的文件(5000 个 files.xml),因此第一行是 FILENAME 第二行到第五行是需要成为 xml 文件中字段的信息,如下所示:
<?xml version='1.0' encoding='UTF-8'?><Metadata> <artist></artist> <song></song> <album></album> <year></year></Metadata>
有人可以帮我编写脚本吗?
到目前为止,我已经从文档中删除了 # form FILENAME 并做了如下操作:
但无法创建多个文件
#!/bin/bash
while read line;
if [[ $line == FILENAME* ]]; then
filename="${line:9}"
fi
if [[ $line == *artist* ]]; then
artist=$line
fi
if [[ $line == *song* ]]; then
song=$line
fi
if [[ $line == *album* ]]; then
album=$line
fi
if [[ $line == *year* ]]; then
year=$line
fi
do
echo "<?xml version='1.0' encoding='UTF-8'?><Metadata> $artist $song $album $year</Metadata>"
done < popis.txt > $filename
答案1
您可以使用以下命令将文件拆分
popis.txt
为 5000 多个临时文件分裂 (GNU coreutils)命令:split -d -a4 -l5 popis.txt split
这将创建文件
split0001
,split0002
, ...,每个文件包含五行,并使进一步处理变得更容易。创建您的修改后的脚本并将其另存为
script.sh
:#!/bin/bash for file; do while read -r line; do if [[ "$line" = "<artist>"* ]]; then artist=$line elif [[ "$line" = "<song>"* ]]; then song=$line elif [[ "$line" = "<album>"* ]]; then album=$line elif [[ "$line" = "<year>"* ]]; then year=$line else # remove prefix `#FILENAME "` and the last quote `"` filename=$(echo "$line" | sed 's/[^"]*"//;s/"[[:space:]]*$//') fi done < "$file" echo "<?xml version='1.0' encoding='UTF-8'?><Metadata>${artist}${song}${album}${year}</Metadata>" > "$filename" done
splitXXXX
使您的脚本可执行并在所有文件上运行该脚本:chmod +x script.sh ./script.sh split*
如果一切顺利,这应该为每个输入文件创建一个 XML 文件,您可以删除临时文件:
rm split*