我试图通过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
,后者将其视为a
ppend命令的结束。
还需要注意数据中的双引号需要转义,这样它们就不会被认为是包含整个数据的结束引号。
考虑到数据的数量和动态生成数据的存在,最好将通用数据存储在自己的文件中,对该文件进行第一次传递,用变量的值替换变量,然后使用sed
或其他方法插入整个转换后的文件(用sed
命令w filename
)。这样,您就不必为数据中包含的每个可以被解析为元字符的字符而烦恼,因为文件中的数据将自动被解析为数据。