通过sed将文本追加到脚本中



我试图通过bash脚本调用目录数组的元素(&Sed),但它打破了:

sed: -e expression #1, char 33: unknown option to `s'

#!/bin/bash

directory=(one two three)

for m in "${directory[@]}"
do
echo "${m}" ;
sed -i -e '45 s/$/napiVersion: extensions/v1beta1nkind: Ingressnmetadata:n  namespace: ${m}n  name: ${m}-api1-ingressn  annotations:n    nginx.ingress.kubernetes.io/use-regex: "true"n    nginx.ingress.kubernetes.io/configuration-snippet: |n      rewrite "(?i)/${m}/api1/(.*)" /$1 break;n      rewrite "(?i)/${m}/api1$" / break;n  labels:n    Name: ${m}n    App: test-apin    Tier: endnspec:n  rules:n  - host: www.test.comn    http:n      paths:n      - backend:n          serviceName: ${m}-test-api-1n          servicePort: 80n        path: /${m}/api1nn---nnapiVersion: extensions/v1beta1nkind: Ingressnmetadata:n  namespace: ${m}n  name: ${m}-api2-ingressn  annotations:n    nginx.ingress.kubernetes.io/use-regex: "true"n    nginx.ingress.kubernetes.io/configuration-snippet: |n      rewrite "(?i)/${m}/api2/(.*)" /$1 break;n      rewrite "(?i)/${m}/api2$" / break;n  labels:n    Name: ${m}n    App: test-apin    Tier: endnspec:n  rules:n  - host: www.test.comn    http:n      paths:n      - backend:n          serviceName: ${m}-test-api-2n          servicePort: 80n        path: /${m}/api2/g' /home/test/*.yaml;
done

您应该能够使用以下命令:

sed -i -e "45 a
apiVersion: extensions/v1beta1n
kind: Ingressn
metadata:n
namespace: ${m}n
name: ${m}-api1-ingressn
annotations:n
nginx.ingress.kubernetes.io/use-regex: "true"n
nginx.ingress.kubernetes.io/configuration-snippet: |n
rewrite "(?i)/${m}/api1/(.*)" /$1 break;n
rewrite "(?i)/${m}/api1$" / break;n
labels:n
Name: ${m}n
App: test-apin
Tier: endnspec:n
rules:n
- host: www.test.comn
http:n
paths:n
- backend:n
serviceName: ${m}-test-api-1n
servicePort: 80n
path: /${m}/api1n
n
---n
n
apiVersion: extensions/v1beta1n
kind: Ingressnmetadata:n
namespace: ${m}n
name: ${m}-api2-ingressn
annotations:n
nginx.ingress.kubernetes.io/use-regex: "true"n
nginx.ingress.kubernetes.io/configuration-snippet: |n
rewrite "(?i)/${m}/api2/(.*)" /$1 break;n
rewrite "(?i)/${m}/api2$" / break;n
labels:n
Name: ${m}n
App: test-apin
Tier: endn
spec:n
rules:n
- host: www.test.comn
http:n
paths:n
- backend:n
serviceName: ${m}-test-api-2n
servicePort: 80n
path: /${m}/api2" 
/home/test/*.yaml

注意以n结尾的每一行:n用于sed添加换行,而用于转义随后的换行,并让bash将其解析为装饰性并避免将其传递给sed,后者将其视为append命令的结束。

还需要注意数据中的双引号需要转义,这样它们就不会被认为是包含整个数据的结束引号。

考虑到数据的数量和动态生成数据的存在,最好将通用数据存储在自己的文件中,对该文件进行第一次传递,用变量的值替换变量,然后使用sed或其他方法插入整个转换后的文件(用sed命令w filename)。这样,您就不必为数据中包含的每个可以被解析为元字符的字符而烦恼,因为文件中的数据将自动被解析为数据。

最新更新