異なる値に影響を与えずに2つの同じ値をsedする方法

異なる値に影響を与えずに2つの同じ値をsedする方法

XMLファイルがありますが、ファイルの値を変更したいと思います。

param name=swam_license_ports_overdraft_thresh

99

param name="strike_license_ports_overdraft_thresh"

99

私が望む結果は、param name = swam_license_ports_overdraft_threshの下の値99を90に変更し、param name = "strike_license_ports_overdraft_thresh"の下の他の値99を変更しないことです。

答え1

私が正しく理解した場合は、最初の一致のみを削除したいので、次のようにすることができます。

sed -e '/99/{s//XXX/;:a;n;ba}' file

GNUを使用すると、sed次のことができます。

sed -e '0,/99/s//XXX/' file

答え2

最初の一致を削除する(行を保持)

awk '!x&&/99/{x++;$0=y}1' file

最初の一致を削除する(行を保持しない)

awk '!x&&/99/{x++;next}1' file

最初の一致を置き換える

awk '!x&&/99/{x++;$0="98"}1' file

答え3

sed -n 'h;/match/n;G;P;//D'

最初の項目のみが削除されます。マッチすべての入力ファイルで。それ

  • h各行は既存のスペースを覆います。

  • 次の入力でパターンスペースを上書きするマッチワイヤー

  • Getsはパターンスペースに追加されたスペースを予約します。

  • P\nパターンスペースで最初に表示されるewline文字まで印刷します。

  • D同じ要素マッチワイヤー

しかし問題はこのプロセスですすべて最初の発生後の行マッチまたなるマッチ次の行に達する前に。したがって、常に一致し、印刷されません。

sed '/match/x;//x'

この値は、次の最初の項目を置き換えます。マッチ空行を含むファイル。

  • 存在するマッチsedeラインは既存の空間とパターン空間をx変えます。h

  • 新しいパターン空間なら(古いパターン空間)返品マッチそれはxまた変わります。

  • それ以外の場合は、最初の発生をそのまま維持します。マッチ新旧hスペースと印刷余白パターン空間に

関連情報