首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在shell中的字符串匹配之后向下一行添加12个空格?

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

Unix & Linux用户
提问于 2021-09-30 12:46:10
回答 2查看 333关注 0票数 0

我有一个名为config.toml的文件。我正在使用runc.options进行字符串匹配,如图像中突出显示的那样。我需要在12个空格后插入一个字符串"Systemdgroup = true"。我尝试了下面的命令,这个命令可以工作,但是使用了手动的12个空格。如何以另一种方式实现这一目标?

代码语言:javascript
运行
复制
sed -e "/runc.options/a\            SystemdCgroup = true" /etc/containerd/config.toml

而不是输入字面上的12个空格,任何类似/s+12的工作?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2021-09-30 13:53:53

对于REGEX模式,您真的不能直接这样做,但是您可以(Ab)使用printf的S选项来左击空格和空字符串:

代码语言:javascript
运行
复制
sed "/pattern/a$(printf '\%12s')SystemCgroup = .../" file 

请注意,百分比符号需要转义。

票数 0
EN

Unix & Linux用户

发布于 2021-09-30 14:29:04

使用TOML解析器tomlq (来自https://kislyuk.github.io/yq/):

代码语言:javascript
运行
复制
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,如果您想插入与前一行相同的缩进深度的文本行,请考虑重用前一行的缩进。

代码语言:javascript
运行
复制
/^\([[:blank:]]*\)\[.*runc\.options\].*/ {
    h
    s//\1  SystemdCgroup = true/
    H
    g
}

这个sed脚本匹配我们正在寻找的特定的节标签,并记住该行上的[之前的空格数。它在持有空间中保存行的副本,用新的数据替换缓冲区中的行,使用\1插入原始缩进。然后将缓冲区附加到保持空间(这将插入换行符),并将保持空间提取到待打印的编辑缓冲区中。

但是,请注意,sed和类似的面向行的工具通常不足以处理结构化文档格式,如TOML、YAML、JSON和XML。这些格式并不总是以行分隔,因为它们可能需要特定的数据编码。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/671271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档