我正在尝试使用sed在文本文件中添加几行代码。
我认为我有一些特殊的特点给了我这个问题。
我想在以下内容之间插入行
username: system:node:{{EC2PrivateDNSName}}
和
kind: ConfigMap
这就是我想要插入的-
- 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}}”这一行。
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
以下是我要插入的文件的内容-
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"
发布于 2020-12-10 00:56:52
更新:考虑到OPs答案/注释re:缺少空格,以及更多的麻烦,我也能够让以下sed
命令工作:
sed '/^.*username.*EC2PrivateDNSName.*$/r'<(cat replace.txt) temp-aws-auth.yaml
假设:
username ... EC2PrivateDNSName
仅显示在文件中的一个位置(或者,它显示在多个位置,OP希望在每次出现后添加新行)替换数据:
$ 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
的想法:
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
或作为单行:
awk 'FNR==NR {a[FNR]=$0; next} {print} /username.*EC2PrivateDNSName/ { for (i in a) print a[i]; next}' replace.txt temp-aws-auth.yaml
这将生成:
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"
发布于 2020-12-10 02:06:03
我用我原来的命令发现了这个问题-- Sed需要在它要查找的行中包含空格!
因为我要查找的行中有空格:
' username: system:node:{{EC2PrivateDNSName}}'
我必须在sed语句中添加空格:
sed '/^ username\: system:node\:{{EC2PrivateDNSName}}$/r'<(
感谢您的反馈!假日快乐!!
发布于 2020-12-10 02:25:49
这可能适用于您(GNU sed和cat):
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 -
。
https://stackoverflow.com/questions/65220979
复制相似问题