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