ファイルの他の特定の文字列の後に続く一致する文字列を置き換えます。

ファイルの他の特定の文字列の後に続く一致する文字列を置き換えます。

ssl.cfgSSL要求用の構成ファイル()があります。

oid_section = OIDs

[req]
default_bits = 4096
prompt = no
default_md = sha256
distinguished_name = dn

attributes = v3_req

[OIDs]
OrganizationID = 2.5.4.97        # Don't touch this

[dn]
C = FO
ST = Foobar Monarchy
O = Lorem Ipsum
CN = specific.domain.com
OrganizationID = ABCDE-12345     # Change this
#...

[v3_req]
#...

交換しようとしています。第二 OrganizationIDvalue(ABCDE-12345)と新しい値ABCDE-98765

問題は、ほとんどがOrganizationID同じでなければならない2つの同じ名前間の衝突に対してオブジェクトを一致させることです(下の部分[OIDs]はマークアップタグであり、2番目の発生は実際には使用ブランド)。

私が試したこと:

1)この回答で修正されたコード(一致後の改行)スタックオーバーフロー:

REQ_ID="ABCDE-98765"
sed -i "/CN =/!b;n;c\\OrganizationID = ${REQ_ID}" ssl.cfg
  • 前の行と一致します。CN = ...
  • !b現在の試合中断
  • n次の行をスキャン
  • c選択した行を次のテキストに変更します(\新しい行の印刷、\\二重引用符()でエスケープされます)

私はこの解決策が前の行の位置に依存しているのであまり好きではありません。誰かが手動でCNを別の回線に置き換えると、問題が発生します。

2) 以前の試みから得た知識を活用する。

REQ_ID="ABCDE-98765"
sed -i "/\\\[dn\\\]/!b;/OrganizationID/c\\OrganizationID = ${REQ_ID}" ssl.cfg

ここでは以下を試しました。

  • 一致[dn](デュアルエスケープ[]
  • 現在の試合中断
  • この時点から始めて、次の OrganizationID エントリを探します。
  • 代わりに使用c\...

これはうまくいきません。 2回目のゲームが最初からやり直すような気がします。両方の項目が一致すると、何も変わらないようです。

具体的には、[dn]の位置に関係なく、OrgIDを一致させる方法を探しています。その値の文字列はABCDE-変更されないかもしれませんが、それに依存したくありません。オブジェクト識別子2.5.4.97 変わらないだろう

結論として:

  1. 特定の行から始めてファイルを閲覧する方法はありますか? ([dn]タグを使用)
  2. 上記の目標を達成する他の方法はありますか? ( awk? 他の sysutils + パイプ?...)

(タイトルが混乱して申し訳ありません。どのように表現するのかわかりません。)

ベストアンサー1

$ awk -v org='ABCDE-12345' -v RS= -v ORS='\n\n' '
    $1 == "[dn]" {
        $0 = "\n" $0
        sub(/\nOrganizationID[[:space:]]*=[^\n]*/,"\nOrganizationID = " org)
        sub(/^\n/,"")
    }
    { print }
' file
oid_section = OIDs

[req]
default_bits = 4096
prompt = no
default_md = sha256
distinguished_name = dn

attributes = v3_req

[OIDs]
OrganizationID = 2.5.4.97        # Don't touch this

[dn]
C = FO
ST = Foobar Monarchy
O = Lorem Ipsum
CN = specific.domain.com
OrganizationID = ABCDE-12345
#...

[v3_req]
#...

RS=<null>awkを空行で区切られた短絡モードに設定しますRS = ""https://www.gnu.org/software/gawk/manual/gawk.html#Multiple-Line)、ORS='\n\n'出力が空白行で区切られていることを確認し、レコードの各行の$0 = "\n" $0前に改行文字があることを確認して、レコードの最初の行でも末尾のsub()改行文字の使用を成功させ、追加した一時項目を削除します。最初の行改行ステップ。OrganizationIDsub(/^\n/,"")

おすすめ記事