You need to enable JavaScript to run this app. 使用sed向文件插入指定行失效,是否为特殊字符导致的问题?
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.13 16:36:11