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
。
いずれにせよ、テキストを処理するためにシェルループを使用したくありません。。
答え2
そしてawk
:
awk 'BEGIN{RS="&"}{print $0 > ++c".xml"}' file.xml
ls -ltr