Sed条件付き複数行の変更

Sed条件付き複数行の変更

大規模なファイルセットをいくつか変更する必要がありますが、変更の条件は前の行の内容によって決まります。

例:

<element1>
  <value>true</value>

この場合、行をtrueに変更したいと思います。

ただし、次のような状況が発生した場合:

<wrong_element>
  <value>true</value>

まあ、私はそれを変更したくありません。

sed を使用して変更できますが、すべての値が変更されます。ファイルごとにスペースの量が異なる可能性があるため、スペースを無視するように設定することもできます。

sedを読み、その行に基づいて評価します。前の行の内容に基づいてどのように変更できますか?

ベストアンサー1

これは「sed」ではなく「awk」のようです。

cat file | awk 'BEGIN {lastLINE="XXX";} \
        { if ( lastLINE ~ /element1/ ) gsub(/BADtextREGexpression/,"replaceTEXT") ; printf("%s\n",$0); lastLINE = $0; }'

エラーがない場合、上記のコードは、最後の行に正規表現「element1」に一致するフラグメントがない場合、変更されていないすべての行を印刷します。この場合、印刷する前に、「replaceTEXT」を現在の行(BADtextREG式の代わりに)で完全に置き換えます。

$ 0は、入力ファイルから読み込んだ現在の行全体を表す変数で、gsub()のデフォルトのターゲットです。

「sed」が必要な場合はどうすればいいかわかりません。
オンライン「awk」マニュアルリンク:https://www.gnu.org/software/gawk/manual/gawk.html

おすすめ記事