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

Arrays 通过sed将文本追加到脚本中,arrays,bash,kubernetes,Arrays,Bash,Kubernetes,我试图通过bash脚本(&sed)调用目录数组的元素,但它中断了: sed:-e表达式#1,字符33:s的未知选项 #!/bin/bash directory=(one two three) for m in "${directory[@]}" do echo "${m}" ; sed -i -e '45 s/$/\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n nam

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

sed:-e表达式#1,字符33:s的未知选项

#!/bin/bash


directory=(one two three)


for m in "${directory[@]}"
do
  echo "${m}" ;

sed -i -e '45 s/$/\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  namespace: ${m}\n  name: ${m}-api1-ingress\n  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-api\n    Tier: end\nspec:\n  rules:\n  - host: www.test.com\n    http:\n      paths:\n      - backend:\n          serviceName: ${m}-test-api-1\n          servicePort: 80\n        path: /${m}/api1\n\n---\n\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  namespace: ${m}\n  name: ${m}-api2-ingress\n  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-api\n    Tier: end\nspec:\n  rules:\n  - host: www.test.com\n    http:\n      paths:\n      - backend:\n          serviceName: ${m}-test-api-2\n          servicePort: 80\n        path: /${m}/api2/g' /home/test/*.yaml;

done

您应该能够使用以下各项:

sed -i -e "45 a\
apiVersion: extensions/v1beta1\n\
kind: Ingress\n\
metadata:\n\
  namespace: ${m}\n\
  name: ${m}-api1-ingress\n\
  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-api\n\
    Tier: end\nspec:\n\
  rules:\n\
  - host: www.test.com\n\
    http:\n\
      paths:\n\
      - backend:\n\
          serviceName: ${m}-test-api-1\n\
          servicePort: 80\n\
        path: /${m}/api1\n\
\n\
---\n\
\n\
apiVersion: extensions/v1beta1\n\
kind: Ingress\nmetadata:\n\
  namespace: ${m}\n\
  name: ${m}-api2-ingress\n\
  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-api\n\
    Tier: end\n\
spec:\n\
  rules:\n\
  - host: www.test.com\n\
    http:\n\
      paths:\n\
      - backend:\n\
          serviceName: ${m}-test-api-2\n\
          servicePort: 80\n\
        path: /${m}/api2" \
/home/test/*.yaml
注意以
\n\
结尾的每一行:
\n
用于
sed
添加换行符,虽然<代码> \/COD>是为了逃避下面的线性进给,并具有<代码> BASH >将其解析为装饰性的,并且避免将其传递给<代码> SED >,将其视为<代码>的结束< A/Cord> PopEnter命令。

还要注意,需要对数据中的双引号进行转义,以便它们不会被视为关闭包含整个数据的引号


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

如果您希望在,您看到的错误是由您试图插入的字符串中的斜杠引起的。我建议您使用
sed
a
ppend命令,而不是
s
替换,因为它看起来像是在给定行之后插入多行。正如Raman所说,如果您想要展开
a
ppend命令的变量引用(将
$
替换为行号
45
),则需要双引号:。我建议使用它,因为这样你就不用为
s
选择一个没有出现在字符串中的分隔符&variable我将sed放在双引号中,并用
a
替换
s
,但是在意外标记“?i”附近出现以下错误语法错误sed命令如下:
“sed-i-e'45a/$/\napiVersion:……path:/${m}/api2/g'”
使用$m代替${m}