我正在尝试在 Linux 中读取一个文件,一旦遇到“&”字符,我就会将输出写入另一个文件,将该文件发送到另一个文件夹,然后继续读取原始文件,直到下一个“&”并且很快
输入xml文件-
<Document>
<tag1>
<tag2>
</Document>
&
<Document>
<tag3>
<tag4>
</Document>
&
<Document>
<tag5>
<tag6>
</Document>
我的代码片段 -
while IFS= read -r line;do
if [["$line" =="$delimeter"]];then
echo "$line" | sed "s/delimeter.*//">> "$output_file"
cp "$output_file" "$TARGET_FOLDER"
break
else
echo "$line" >> "$output_file"
fi
done < "$input_file"
但是,代码生成整个文件作为输出,而不是根据分隔符的出现进行分割,我可以指出我出错的地方吗?
预期输出 - 第一个<Document> to </Document>
(直到 &)部分放入输出文件中,该文件被复制到 TARGET_FOLDER。然后复制下<Document> to </Document>
一部分,依此类推。
感谢您的帮助!
答案1
听起来像是一份工作csplit
:
mkdir -p target &&
csplit -f target/output. your-file '/^&$/' '{*}'
将创建target/output.00
, target/output.01
... 文件,分割包含&
.
如果您只想要一个删除了行target/output
的文件&
,那么那就是:
grep -vx '&' < your-file > target/output
或者,如果要发送到目录output
中的文件:target.xx
csplit -f '' -b target.%02d/output your-file '/^&$/' '{*}'
但请注意,target.00
..target.n
目录必须事先存在。
任何状况之下,您不想使用 shell 循环来处理文本。
答案2
和awk
:
awk 'BEGIN{RS="&"}{print $0 > ++c".xml"}' file.xml
ls -ltr