web-dev-qa-db-ja.com

grepとsedを使用してconfig.yamlファイルに変更を加える

Bashスクリプトの使用を編集または変更したいconfig.yamlファイルがあります。だから私は希望する変更を与えるgrepとsedを使用してコマンドを取得しましたが、問題はsedを適用すると編集したいセクションを含むファイル全体に適用されるということです。以下は、編集前のファイルのセクションです。

    ###############################################################################
29  
30  # Manual provisioning configuration
31  # provisioning:
32  #  source: "manual"
33  #  device_connection_string: ""
34  
35  # DPS TPM provisioning configuration
36  # provisioning:
37  #   source: "dps"
38  #   global_endpoint: "https://global.Azure-devices-provisioning.net"
39  #   scope_id: "{scope_id}"
40  #   attestation:
41  #     method: "tpm"
42  #     registration_id: "{registration_id}"
43  
44  # DPS symmetric key provisioning configuration
45  # provisioning:
46  #   source: "dps"
47  #   global_endpoint: "https://global.Azure-devices-provisioning.net"
48  #   scope_id: "{scope_id}"
49  #   attestation:
50  #     method: "symmetric_key"
51  #     registration_id: "{registration_id}"
52  #     symmetric_key: "{symmetric_key}"
53  
54  ###############################################################################

42行目で、「#DPS TPMプロビジョニング構成」から「#registration_id: "{registration_id}"」に編集したいので、次のコマンドを使用します。

grep -Pzom 1 "# DPS TPM provisioning configuration(.|\n)*?(?=\n# DPS)" config.yaml | sed 's/^#[ \t]//' config.yaml

これは私に次の出力を与えます:


Manual provisioning configuration
provisioning:
  source: "manual"
  device_connection_string: ""

DPS TPM provisioning configuration
provisioning:
  source: "dps"
  global_endpoint: "https://global.Azure-devices-provisioning.net"
  scope_id: "{scope_id}"
  attestation:
    method: "tpm"
    registration_id: "{registration_id}"

DPS symmetric key provisioning configuration
provisioning:
  source: "dps"
  global_endpoint: "https://global.Azure-devices-provisioning.net"
  scope_id: "{scope_id}"
  attestation:
    method: "symmetric_key"
    registration_id: "{registration_id}"
    symmetric_key: "{symmetric_key}"

###############################################################################

これにより、必要な部分が編集されますが、それとともにファイル全体も編集されます。ファイル全体ではなく、ファイルのgrep出力のみにsedを適用したいだけです。誰かがコマンドを手伝ってくれる?

2
Prototype

試してください:

sed '
    /# DPS TPM provisioning configuration/,/#     registration_id: "{registration_id}"/{s/^#//}
' config.yaml

これは、#で指定された範囲に一致する行内のすべての行がs/^#//で始まる//,//でコメント解除されます。

1
αғsнιη