![多行sed脚本错误:换行符不能用作字符串分隔符](https://linux22.com/image/148677/%E5%A4%9A%E8%A1%8Csed%E8%84%9A%E6%9C%AC%E9%94%99%E8%AF%AF%EF%BC%9A%E6%8D%A2%E8%A1%8C%E7%AC%A6%E4%B8%8D%E8%83%BD%E7%94%A8%E4%BD%9C%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%88%86%E9%9A%94%E7%AC%A6.png)
我正在尝试让这个sed
命令起作用:
sed -e \
's|$API_URL|$(API_URL)|g ; \
s|$API_KEY|$(API_KEY)|g ; \
s|$API_SECRET|$(API_SECRET)|g ; \
s|$API_SALT|$(API_SALT)|g ; \
s|$STORAGE_FUNCTION|$(STORAGE_FUNCTION)|g ; \
s|$STORAGE_ACCOUNT|$(STORAGE_ACCOUNT)|g ; \
s|$STORAGE_CONTAINER|$(STORAGE_CONTAINER)|g' \
./src/environments/environment.template.ts > ./src/environments/environment.ts
我正在替换文件中的占位符:
export const environment = {
api: {
url: '$API_URL',
key: '$API_KEY',
secret: '$API_SECRET',
salt: '$API_SALT'
}
};
但我收到这个错误:
换行符不能用作字符串分隔符
答案1
实际错误来自这样的事实:当用作行地址时,通过在分隔符前面加上反斜杠,可以使用任意分隔符来分隔正则表达式,如
\@hello@d
这将删除与正则表达式匹配的每一行hello
,就像
/hello/d
会。
但是,换行符不能以这种方式用作分隔符。因此出现了错误。
该sed
脚本不需要转义换行符,因为它全部位于单引号字符串内。删除\
实际编辑脚本每行末尾的sed
:
sed -e 's|$API_URL|$(API_URL)|g
s|$API_KEY|$(API_KEY)|g
s|$API_SECRET|$(API_SECRET)|g
s|$API_SALT|$(API_SALT)|g
s|$STORAGE_FUNCTION|$(STORAGE_FUNCTION)|g
s|$STORAGE_ACCOUNT|$(STORAGE_ACCOUNT)|g
s|$STORAGE_CONTAINER|$(STORAGE_CONTAINER)|g' \
infile >outfile
请注意,;
语句之间被换行符替换。仅在占据同一行的语句之间需要它们,例如G;s/\n/ /
,在 中。
或者:
sed -e 's|$API_URL|$(API_URL)|g' \
-e 's|$API_KEY|$(API_KEY)|g' \
-e 's|$API_SECRET|$(API_SECRET)|g' \
-e 's|$API_SALT|$(API_SALT)|g' \
-e 's|$STORAGE_FUNCTION|$(STORAGE_FUNCTION)|g' \
-e 's|$STORAGE_ACCOUNT|$(STORAGE_ACCOUNT)|g' \
-e 's|$STORAGE_CONTAINER|$(STORAGE_CONTAINER)|g' \
infile >outfile
或者,
sed "s/'\\$\([^']*\)'/'\$(\1)'/g" infile >outfile
替换任何看起来像的'$something Whatever'
东西'$(something Whatever)'
。
或者,
sed 's/$\([A-Z_]*\)/$(\1)/g' infile >outfile
替换看起来像的东西$SOME_THING
($(SOME_THING)
对变量名称中允许的字符稍微严格一些,但不关心单引号)。