最初の2行の末尾に二重引用符プロパティを追加するにはどうすればよいですか?

最初の2行の末尾に二重引用符プロパティを追加するにはどうすればよいですか?

次の属性を追加しようとしています。

-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M

- という単語を含む最初の2行HBASE_MASTER_OPTS

変更前の例:

more ams-hbase-env-template.txt

export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly"    
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=71 -XX:+UseCMSInitiatingOccupancyOnly"
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=72 -XX:+UseCMSInitiatingOccupancyOnly"
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=73 -XX:+UseCMSInitiatingOccupancyOnly"

変更された例(予想結果):

export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M"    
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=71 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M"
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=72 -XX:+UseCMSInitiatingOccupancyOnly"
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=73 -XX:+UseCMSInitiatingOccupancyOnly"

これまで私がしたことは次のとおりです。

sed -i '/HBASE_MASTER_OPTS/ s/$/-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M/' ams-hbase-env-template.txt

しかし、これは次の理由で間違っています。

  1. 私たちは二重引用符が終わる前に属性が欲しいです。

  2. 属性は、HBASE_MASTER_OPTS変数の最初の2行にのみ必要です。

  3. 属性がすでにキューにある場合は、次に追加されません。

答え1

このソリューションはどうですかawk?問題から目的の出力を生成します。

awk '/HBASE_MASTER_OPTS/&&x<2{gsub(/"$/," -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M\"");x++}1' ams-hbase-env-template.txt

オンラインでお試しください!

答え2

Steveの答えを拡張すると、次のようになります。

awk '/HBASE_MASTER_OPTS/&&/ -XX:[+]UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M/{x++;print;next}/HBASE_MASTER_OPTS/&&x<2{gsub(/"$/," -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M\"");x++}1' ams-hbase-env-template.txt

更新:以下は、各文字列が一度だけ表示されるメンテナンスが簡単なバージョンです。

awk 'BEGIN{p="-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M"}{m=0}/HBASE_MASTER_OPTS/{m=1;++x}m&&index($0,p){print;next}m&&x<=2{gsub(/"$/," " p "\"")}1' ams-hbase-env-template.txt

いくつかの説明があります。

  • パターンマッチングの最初のバージョンでは、[+]リテラル+文字が使用されました。そうでなければ、+特殊文字として解釈されるからです。

残りのポイントは、2番目のバージョンについてです。

  • InBEGIN句、属性文字列p句が定義されました。次のセクションはすべて入力行に適用されます。
  • {m=0}:このセクションには条件はありません。つまり、すべての行に適用されるため、すべての行に対して最初にm(一致する場合)0に設定されます。
  • /HBASE_MASTER_OPTS/{m=1;++x}:行がHBASE_MASTER_OPTS文字列と一致すると、mその行が設定され、ラインカウンタがインクリメントされます。
  • m&&index($0,p){print;next}:この句は、とマークされている一致を確認するだけでなく、m入力行に属性文字列が含まれていることを確認します。この場合、indexゼロ以外の値が返されます。その場合は、行をそのまま印刷し(属性が追加されなくなりました)、next残りの句をスキップして次の行処理を開始します。以下の用語はもともとSteveによって提供され、私だけが適用したものです。
  • m&&x<=2{gsub(/"$/," " p "\"")}:この点に到達し、一致する行があり、カウンタが2を超えない場合は、$0端末の前にスペースと"変更する属性文字列(入力行)を追加して修正(入力行)します。それ以外の場合、出力は生成されず、これは次のセクションで行われます。
  • 1:これはジョブがない条件(常にtrue)です。つまり、ジョブがデフォルトで入力行を印刷することを意味します。

関連情報