如何在shell中的字符串匹配后添加12个空格到下一行?

如何在shell中的字符串匹配后添加12个空格到下一行?

我有一个名为config.toml.我正在与runc.options图像中突出显示的字符串进行匹配。我需要"Systemdgroup = true"在 12 个空格后插入一个字符串。我尝试了以下命令,该命令有效,但使用了手动的白色12个空格。如何以另一种方式实现?

sed -e "/runc.options/a\            SystemdCgroup = true" /etc/containerd/config.toml

在此输入图像描述

除了键入 12 个空格之外,还可以输入类似/s+12工作之类的内容吗?

答案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。这些格式并不总是以行分隔,因为它们可能需要特定的数据编码。

相关内容