sed - 使用前一行的缩进添加新行
问题描述
从现在开始,我一直在努力通过使用 sed 在新行中添加一个元素来更新一些 yaml 文件。
sed 命令(或另一个 linux 命令)必须匹配一个字符串(image:
或- image:
),在新行上添加一个与前一行具有相同缩进的新元素。
问题是新行必须正好在字符串下方,image:
而不是在- image:
.
示例:当 sed 匹配字符串image
时,它会添加具有正确缩进的新行(就在上面image
)
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: calico-node
spec:
template:
spec:
containers:
- name: calico-node
image: myimage
imagePullSecret: mysecret
...
示例 2:当 sed 匹配 string 时- image
,它会添加具有正确缩进的新行(就在上面image
而不是-
):
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: calico-node
spec:
template:
spec:
containers:
- image: myimage
imagePullSecret: mysecret
...
不想要的是
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: calico-node
spec:
template:
spec:
containers:
- image: myimage
imagePullSecret: mysecret
我已经尝试过yq
命令来处理这个问题,但这是一个巨大的痛苦......
- image
我在另一个线程中找到了此代码,但在匹配字符串时它不起作用。
sed '/^ *image: .*/ { G; s/^\( *\)image: .*/&\1imagePullSecret: mysecret/; }' sed.yaml
解决方案
我不容忍使用sed
to parse yaml
,但如果你真的想这样做,你可以尝试这样的事情:
$ nl='
'
$ printf ' image:\n - image:\n' |
sed -e "s/\(^\( *\)image:\)/\1\\$nl\2inserted text/" \
-e "s/\(^\( *\)- image:\)/\1\\$nl\2 inserted text/"
image:
inserted text
- image:
inserted text
推荐阅读
- c# - 从另一个线程调用时不会触发操作
- c# - 在 asp.net 网络表单中注册后,如何通过电子邮件从 sql 数据库向用户发送自动生成的 ID
- r - 在 ddply/dlply 中嵌套 nlm 函数
- java - 连接到 AWS 海王星
- amazon-web-services - AWS 是否根据传入请求的数量或会话的持续时间收费?
- android - 如何在单个文本视图中为特定文本和点击侦听器设置颜色
- ruby-on-rails - React 与 Ruby on Rails 的集成。
- visual-studio - VS2017 15.7.5 不会自动检出文件
- jquery - jQuery onchange 函数不适用于动态生成的选择标签
- python - 使用脚本扩展 CMake 是一种好习惯吗?