Linuxで前の行に行の並べ替えを追加するには?

Linuxで前の行に行の並べ替えを追加するには?

XMLファイルがたくさんあります。で終わる行があります</autoReferenceLines>。この行はファイルごとに先行スペースが異なる場合があります。その行の下に新しい行を追加し、すべてのファイルで同じ先行スペースを使用したいと思います。

新しい行を追加できますが、新しい行を前の行と同じソートにする方法がわかりません。

私が今持っているのはこれです:

find ${location} -type f -name "*.xml" -path "**/adult/**" -exec sed -i '/<\/autoReferenceLines>/a <ztv>0<\/ztv>' {} +

編集する:

xmlを編集するためのいくつかのツールがあることがわかりましたxmlstarlet。しかし、私が思う限り、bashコマンドを使用する方が良いです。インストールする権限がありません。

特定の行の先行スペースを計算する方法はありますか?たとえば、行の先頭のスペースを計算します。</autoReferenceLines>

編集2:

入力する:

  <Parameter> 
    <autoTransfer>Nowhere</autoTransfer>
    <toFilm>0</toFilm>
    <autoReferenceLines>0</autoReferenceLines>
  </Parameter>

バグは別のファイルにあり、インデントも異なります。したがって、行ごとに先行スペースが異なります。

予想出力:

  </Parameter>
    <autoTransfer>Nowhere</autoTransfer>
    <toFilm>0</toFilm>
    <autoReferenceLines>0</autoReferenceLines>
    <ztv>0</ztv>
  </Parameter> 

ベストアンサー1

Gnu sed ではこれを行うことができます。あなたのfindコマンドを使用し、そのsed部分を修正しました。

$ find ${location} -type f -name "*.xml" -path "*/adult/*" -exec sed -i -e '/<\/autoReferenceLines>/!b' -e 'h;s/\S.*/<ztv>0<\/ztv>/;H;g' {} +

あるいは、改行をエスケープして拡張しますが、まだ1行で処理します。

$ find ${location} -type f \
   -name "*.xml" -path "*/adult/*" \
   -exec sed -i \
    -e '/<\/autoReferenceLines>/!b' \   
    -e 'h;s/\S.*/<ztv>0<\/ztv>/;H;g' \
   {} +;

布材:

よく書かれfind、編集が必要な必須ファイルも選択しましたsed

sedコマンドは、自動引用符付き文字列を含む行を探します。h作業を始める前にコピーを保存してください。次に、空白ではなく、最初の行から\S行の終わりまですべて削除します。これで先行スペース(存在する場合)が残ります。これを行うときに必要な文字列ztvも貼り付けます。これで、同じ数の先行スペースと必須文字列が作成されました。

次に、作成した文字列を元のストレージラインに追加し、Hそれgをパターンスペースに配置します。

-iこのオプションは、gnu sed の複数のファイルと組み合わせて使用​​する場合に意味されるため、-s明示的には提供しません。

おすすめ記事