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
明示的には提供しません。
答え2
このコマンドは必要な操作を実行する必要があります。
find ${location} -type f -name "*.xml" -path "**/adult/**" -exec grep -q '</autoReferenceLines>' {} \; -exec perl -i"*" -ne 'print; print "$1<ztv>0</ztv>\n" if (m[^(\s*).*</autoReferenceLines>])' {} \;