使用sed向文件插入指定行失效,是否为特殊字符导致的问题?
问题根因
- 目标行匹配逻辑失效:原文件中
username: system:node:{{EC2PrivateDNSName}}所在行带有6个空格的前置缩进,并非以username作为行首内容;但原sed匹配规则添加了^锚定行首必须直接为username,完全无法命中目标行,自然不会触发插入操作。同时原规则添加的$锚定行尾,会在目标行存在尾随空格时进一步提升匹配失败概率。 - 正则特殊字符兼容风险:sed默认采用基础正则(BRE)模式,字面量
{属于正则元字符,直接书写{{在BSD版本的sed实现中可能被误解析为区间量词语法,导致匹配异常。 - 插入内容存在笔误:预设插入的配置中用户名字段为
test-ecr,原命令的echo语句误写为ecr,即使插入成功也会出现内容错误。 - 冗余转义:冒号不属于正则元字符,原命令中对冒号添加反斜杠转义无实际作用,不影响执行但属于不必要的操作。
修正后的可执行方案
利用sed的r命令特性:匹配到目标行后,会在当前行内容输出完成后,紧接着输出指定来源的内容,刚好落在目标行与后续kind: ConfigMap行的中间位置,完全符合插入位置要求。
修正后的完整命令如下:
sed '/username: system:node:{{EC2PrivateDNSName}}/r'<( echo " - groups:" echo " - eks-role" echo " - system:master" echo " rolearn: arn:aws:iam::xxxxx:role/eks" echo " username: eks" echo " mapUsers: |" echo " - userarn: arn:aws:iam::xxxxx:user/test-ecr" echo " username: test-ecr" echo " groups:" echo " - eks-role" ) -i -- temp-aws-auth.yaml
备注:如果使用BSD版本的sed(如macOS系统自带的sed),需要将匹配式中的
{转义为\{,即替换匹配规则为/username: system:node:\{\{EC2PrivateDNSName\}\}/,避免正则解析错误。
执行后的预期文件结构
apiVersion: v1 data: mapRoles: | - groups: - system:bootstrappers - system:nodes rolearn: arn:aws:iam::xxxxx:role/eksctl-ops-nodegroup-linux-ng-sys-NodeInstanceRole-763ALQD2ZGXK username: system:node:{{EC2PrivateDNSName}} - groups: - eks-role - system:master rolearn: arn:aws:iam::xxxxx:role/eks username: eks mapUsers: | - userarn: arn:aws:iam::xxxxx:user/test-ecr username: test-ecr groups: - eks-role kind: ConfigMap metadata: creationTimestamp: "2020-12-09T15:54:56Z" name: aws-auth namespace: kube-system resourceVersion: "1298"
内容的提问来源于stack exchange,提问作者ErnieAndBert
相关产品推荐
相关产品推荐

