我有一个名为config.toml
的文件。我正在使用runc.options
进行字符串匹配,如图像中突出显示的那样。我需要在12个空格后插入一个字符串"Systemdgroup = true"
。我尝试了下面的命令,这个命令可以工作,但是使用了手动的12个空格。如何以另一种方式实现这一目标?
sed -e "/runc.options/a\ SystemdCgroup = true" /etc/containerd/config.toml
而不是输入字面上的12个空格,任何类似/s+12
的工作?
发布于 2021-09-30 13:53:53
对于REGEX模式,您真的不能直接这样做,但是您可以(Ab)使用printf
的S选项来左击空格和空字符串:
sed "/pattern/a$(printf '\%12s')SystemCgroup = .../" file
请注意,百分比符号需要转义。
发布于 2021-09-30 14:29:04
使用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。这些格式并不总是以行分隔,因为它们可能需要特定的数据编码。
https://unix.stackexchange.com/questions/671271
复制相似问题