我有一个 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/^#//
中指定的匹配范围内的行内//,//
。