读取文件直到特殊字符,将该部分复制到另一个文件中,然后继续直到 eof

读取文件直到特殊字符,将该部分复制到另一个文件中,然后继续直到 eof

我正在尝试在 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

相关内容