リンクされたXMLファイルのクリーンアップ

リンクされたXMLファイルのクリーンアップ

私は私の問題を修正しようとしています。おいしいエクスポートスクリプト新しい」いたずら「一度に1000のブッ​​クマークのみが提供されています。スクリプトは複数の呼び出しの結果(XML)を1つのファイルにリンクするため、結果ファイルからヘッダーとフッターテキストを削除する必要があります。例:

<?xml ...
<posts ...
  <post ...
  ...          # 998 other posts
  <post ...
</posts>     # Line 1003
# The above lines are repeated N times before the final line:
</posts>

つまり、<post(排他的に)3行目と最後の行の間で始まらない行を削除したいのですが、各XMLブロックには最後の行を除いて正確に1003行があります。

私は完璧だと思うかsed完璧でawkなければなりません。

答え1

データ型が一貫しているため、ヘッダーとトレーラーが友達になります。これは最後の短いファイルでも機能します。

cat file | tail -n +3 | head -n -1 > trimmed_file

tail -n +3 はファイルの 3 行目から最後まですべてを取得し、head -n -1 はファイルの最後の行を除くすべてを取得します。

切り捨てられたファイルセットがある場合は、ファイル全体の適切なヘッダーとフッターセクションと一緒に配置します。

更新:複数の追加ファイルを作成したくない場合は、そのファイルをforループに囲みます。

for i in *
do
    cat $i | tail -n +3 | head -n -1 >> newfile
done

headでファイルの1つを実行して最初の3行を抽出し、上記のforループを実行してヘッダーテンプレートを取得します。次に、tailを使用して同様の操作を実行して、ファイルの1つの最後の行を取得して新しいファイルに追加します。ヘッダーとフッター情報を更新する必要があるようです。

答え2

働く:

sed -i -e '3,${/^</d}' file

つまり、3行目と最後の行の間で始まる行をすべて削除します<。申し訳ありません。元の投稿にインデントは表示されませんでした。

答え3

これは少しぎこちないようです。なぜ着信データを直接処理しないのですか?

bookmarks_count=$chunk_size
total_bookmarks_count=0
{
  while [ $bookmarks_count -eq $chunk_size ]; do
    chunk=$(wget … -O - "$EXPORT_URL?start=$total_bookmarks_count")
    bookmarks_count=$(printf %s "$chunk" | grep -c "$bookmark_prefix")
    total_bookmarks_count=$((total_bookmarks_count + bookmarks_count))
    printf %s "$chunk" |
    sed -e 's#><#>\n<#g' -e "$EXPORT_COMPATIBILITY" -e "$EXPORT_COMPATIBILITY"
  done
  echo '<\/posts>'
} >"$EXPORT_PATH"

少しトリッキーですが、各ブロックをメモリに保存することを避けることができます。これは他のシェルではkshとzshでのみ機能する方法であり、パイプの右側はサブシェルで実行されるため、値はtotal_bookmarks_count更新されません。

{
  total_bookmarks_count=0
  while
      wget … -O - "$EXPORT_URL?start=$bookmarks_count" |
      sed -e … |
      tee /dev/fd/3 |
      this_chunk_size=$(grep -c "$bookmark_prefix")
      [[ $this_chunk_size = $chunk_size ]]
  do
    ((total_bookmarks_count += chunk_size))
  done
  echo '<\/posts>' >&3
} 3>"$EXPORT_PATH"

パイプから得られる唯一の情報は、戻り状態だけである他のシェルでこれを行う方法は次のとおりです。

: >"$EXPORT_PATH"
total_bookmarks_count=0
while
    wget … -O - "$EXPORT_URL?start=$bookmarks_count" |
    sed -e … |
    tee -a "$EXPORT_PATH" |
    [ $(grep -c "$bookmark_prefix") = $chunk_size ]
do
  total_bookmarks_count=$((total_bookmarks_count + chunk_size))
done
echo '<\/posts>' >> "$EXPORT_PATH"

関連情報