使用 grep 和 sed 更改 config.yaml 文件

使用 grep 和 sed 更改 config.yaml 文件

我有一个 config.yaml 文件,我想使用 bash 脚本对其进行编辑或更改。因此,我使用 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 provisioning configuration”编辑为“# 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}"

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

这会编辑所需部分,但同时也会编辑整个文件。我只想将 sed 应用于文件的 grep 输出,而不是整个文件。有人能帮忙使用命令吗?

答案1

尝试:

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

取消注释以 开头的每一行,#s/^#//中指定的匹配范围内的行内//,//

相关内容