特殊文字までファイルを読み取り、その部分を別のファイルにコピーして、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.00target/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

いずれにせよ、テキストを処理するためにシェルループを使用したくありません。

おすすめ記事