答案1
您实际上不能直接使用 REGEX 模式来执行此操作,但您可以(ab)使用printf
的选项来使用空格和空字符串进行左拍:
sed "/pattern/a$(printf '\%12s')SystemCgroup = .../" file
请注意,百分号需要转义。
答案2
使用 TOML 解析器tomlq
(来自https://kislyuk.github.io/yq/):
tomlq -t '.plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options.SystemdCgroup |= true' config.toml
tomlq
与其--in-place
(或) 选项一起使用-i
以进行就地编辑。
上面使用的表达式tomlq
是一个jq
表达式(tomlq
是一个jq
包装器),它将文档结构中的特定键设置为值true
。
请注意,文档中的空格对于文档结构的有效性并不重要。
一般来说,对于sed
,如果您想要以与前一行相同的缩进深度插入一行文本,请考虑重复使用前一行的缩进。
/^\([[:blank:]]*\)\[.*runc\.options\].*/ {
h
s//\1 SystemdCgroup = true/
H
g
}
该sed
脚本与我们正在查找的特定部分标签相匹配,并记住该行前面的空格数[
。它将行的副本保存在保留空间中,用新数据替换缓冲区中的行,用于\1
插入原始缩进。然后将缓冲区附加到保留空间(插入换行符)并将保留空间提取到要打印的编辑缓冲区中。
但请注意,该sed
工具和类似的面向行的工具通常不足以处理结构化文档格式,例如 TOML、YAML、JSON 和 XML。这些格式并不总是以行分隔,因为它们可能需要特定的数据编码。