首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在文件中插入行的sed命令不起作用-是不是有特殊字符的问题?

在文件中插入行的sed命令不起作用-是不是有特殊字符的问题?
EN

Stack Overflow用户
提问于 2020-12-10 00:37:15
回答 3查看 106关注 0票数 0

我正在尝试使用sed在文本文件中添加几行代码。

我认为我有一些特殊的特点给了我这个问题。

我想在以下内容之间插入行

代码语言:javascript
运行
复制
username: system:node:{{EC2PrivateDNSName}}

代码语言:javascript
运行
复制
kind: ConfigMap

这就是我想要插入的-

代码语言:javascript
运行
复制
    - 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

我还尝试在特殊字符周围使用正斜杠,但都没有用。

下面是我现在使用的sed命令,它不起作用-它似乎没有插入任何东西。我假设它找不到“用户名:系统:节点:{{EC2PrivateDNSName}}”这一行。

代码语言:javascript
运行
复制
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: ecr"
echo "    groups:"
echo "    - eks-role"
) -i -- temp-aws-auth.yaml

以下是我要插入的文件的内容-

代码语言:javascript
运行
复制
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}}
kind: ConfigMap
metadata:
  creationTimestamp: "2020-12-09T15:54:56Z"
  name: aws-auth
  namespace: kube-system
  resourceVersion: "1298"
EN

回答 3

Stack Overflow用户

发布于 2020-12-10 00:56:52

更新:考虑到OPs答案/注释re:缺少空格,以及更多的麻烦,我也能够让以下sed命令工作:

代码语言:javascript
运行
复制
sed '/^.*username.*EC2PrivateDNSName.*$/r'<(cat replace.txt) temp-aws-auth.yaml

假设:

  • OP无法使用可识别yaml的工具执行edit
  • username ... EC2PrivateDNSName仅显示在文件中的一个位置(或者,它显示在多个位置,OP希望在每次出现后添加新行)

替换数据:

代码语言:javascript
运行
复制
$ cat replace.txt
    - 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

注意:如果替换数据在一个变量中,它可以作为字符串输入到awk中。

一个awk的想法:

代码语言:javascript
运行
复制
awk '
FNR==NR                       { a[FNR]=$0        # store first file (replacement data) into an array
                                next }           # skip to next line in first file
                              { print }          # print current line of second file
/username.*EC2PrivateDNSName/ { for (i in a)     # if we found our match then dump the contents of array a[] to stdout
                                    print a[i]
                                next
                              }
' replace.txt temp-aws-auth.yaml

或作为单行:

代码语言:javascript
运行
复制
awk 'FNR==NR {a[FNR]=$0; next} {print} /username.*EC2PrivateDNSName/ { for (i in a) print a[i]; next}' replace.txt temp-aws-auth.yaml

这将生成:

代码语言:javascript
运行
复制
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"
票数 2
EN

Stack Overflow用户

发布于 2020-12-10 02:06:03

我用我原来的命令发现了这个问题-- Sed需要在它要查找的行中包含空格!

因为我要查找的行中有空格:

代码语言:javascript
运行
复制
'      username: system:node:{{EC2PrivateDNSName}}'

我必须在sed语句中添加空格:

代码语言:javascript
运行
复制
sed '/^      username\: system:node\:{{EC2PrivateDNSName}}$/r'<(

感谢您的反馈!假日快乐!!

票数 1
EN

Stack Overflow用户

发布于 2020-12-10 02:25:49

这可能适用于您(GNU sed和cat):

代码语言:javascript
运行
复制
cat <<\! |sed  ':a;/username: system:node:{{EC2PrivateDNSName}}/{n;/kind: ConfigMap/!ba;h;s/.*/cat -/ep;g}' file
  - 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
!

创建一个包含要插入的行的here-document。

通过管道将here-document传递给sed命令。

如果一行包含username: system:node:{{EC2PrivateDNSName}},则打印它并获取下一行。

如果以下行不包含kind: ConfigMap,则转到sed循环的开头并重新启动。

否则,复制当前行,用要从here-document插入的行替换/打印当前行,然后用保留空间中的副本覆盖替换。

注:替换行通过替换命令和e标志插入到文档中,替换命令和替换标志评估被替换到模式空间中的内容,即通过管道传递的cat -

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

https://stackoverflow.com/questions/65220979

复制
相关文章

相似问题

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