我的环境变量包含双引号,如下所示:
$echo $CONNECT_SASL_JAAS_CONFIG
org.apache.kafka.common.security.plain.PlainLoginModule required username="USER" password="XXXX/YYY";
“导出”命令的输出:
declare -x CONNECT_SASL_JAAS_CONFIG="org.apache.kafka.common.security.plain.PlainLoginModule required username=\"USER\" password=\"XXXX/YYY\";
我的模板文件内容如下(props.txt):
sasl.jaas.config = JAAS_CONF
我尝试使用以下命令用env变量替换JAAS_CONF:
sed -e "s/JAAS_CONF/$CONNECT_SASL_JAAS_CONFIG/g;" props.txt
这会出现以下错误:
/ tmp#sed -e“ s / JAAS_CONF / $ CONNECT_CONSUMER_SASL_JAAS_CONFIG / g;” props.txt sed:-e表达式#1,字符168:`s'的未知选项
有关如何解决此问题的任何提示?
更新:
注意:
所以最终我的解决方案是:
export TMP_JAAS=${SASL_JAAS_CONFIG//$'\"'/'\\"'}
export PARSED_JAAS=${TMP_JAAS//$'\n'/\ }
sed -e "s|JAAS_CONF|${PARSED_JAAS//$'\n'/\ }|g" file.cong > /tmp/app.conf
答案 0 :(得分:2)
似乎您在调用错误的变量名“ CONNECT_CONSUMER_SASL_JAAS_CONFIG”不是您在echo命令中显示的名称。 尝试:
sed "s/JAAS_CONF/$CONNECT_SASL_JAAS_CONFIG/g" props.txt
输出:
sasl.jaas.config = org.apache.kafka.common.security.plain.PlainLoginModule required username="USER" password="XXXXYYY";
编辑:如果字符串中包含特殊字符,则可以使用其他定界符,例如#或〜或|。代替 /。看起来像:
sed "s#JAAS_CONF#$CONNECT_SASL_JAAS_CONFIG#g" props.txt
答案 1 :(得分:2)
您确定$ CONNECT_SASL_JAAS_CONFIG的内容是您所期望的吗?确保$ CONNECT_SASL_JAAS_CONFIG中的内容正确。因为错误消息中的索引“ 168”表明您具有至少168个字符的结果命令行。但这不应该。
我可以使用以下方式重现这种错误:
$ var=xxx/
$ sed -e "s/JAAS_CONF/$var/g;" props.txt
sed: -e expression #1, char 17: unknown option to `s'
因此,请尝试通过打印变量内容来确保窥视正确的变量,以确保它符合您的期望,并使用“ {}”保护命令行:
$ sed -e "s/JAAS_CONF/${CONNECT_SASL_JAAS_CONFIG}/g;" props.txt
答案 2 :(得分:2)
要查看如何在sed
命令中扩展变量,请执行以下操作:
set -xv
sed -e "s/JAAS_CONF/$CONNECT_SASL_JAAS_CONFIG/g;" props.txt
set +xv`
这应该产生类似以下内容的
+ sed -e 's/JAAS_CONF/org.apache.kafka.common.security.plain.PlainLoginModule required username="USER" password="XXXX/YYY";/g;' props.txt
sed: -e expression #1, char 109: unknown option to `s'
嵌入的双引号和正斜杠(在变量中)引起您的问题;正斜杠可以使用其他定界符(如@Rachid所指出的)来解决。
双引号可以通过几种方式解决,一种想法:
$ sed -e 's|JAAS_CONF|'"${CONNECT_SASL_JAAS_CONFIG}"'|g;' props.txt
# or
$ sed -e "s|JAAS_CONF|""${CONNECT_SASL_JAAS_CONFIG}""|g;" props.txt
# will produce:
sasl.jaas.config = org.apache.kafka.common.security.plain.PlainLoginModule required username="USER" password="XXXX/YYY";
位置:
sed
命令模式分为三部分...`s | JAAS_CONF |' +“ $ {variable}” +'| g;'答案 3 :(得分:1)
envsubst
:假设您有一个字符串STRING
,您想将其替换为变量VARIABLE_STRING
。然后,我建议采用以下方法:
$
)替换所有感兴趣的变量export
所有感兴趣的变量envsubst
进行替换这里是一个例子:
$ export VARIABLE_STRING='foo "bar" qux'
$ echo "This is the string 'STRING'" | sed 's/\bSTRING\b/$VARIABLE_STRING/g' | envsubst '$VARIABLE_STRING'
This is the string 'foo "bar" qux'
您可以根据自己的喜好进行调整。请阅读[U&L] Replacing only specific variables with envsubst了解更多信息。
如果无法使用envsubst
,则可以用awk编写内容。 GNU awk可以使用ENVIRON
数组访问环境,该数组是从变量名到变量值的映射。示例:
awk 'BEGIN{print ENVIRON["HOME"]}'
这将打印$HOME
所以现在您可以这样:
这看起来像这样:
awk 'BEGIN{ map["NAME1"]="ENVIRONMENT_NAME1"
map["NAME2"]="ENVIRONMENT_NAME2"
map["NAME3"]="ENVIRONMENT_NAME3" }
{ for(i in map) gsub("/<" i "/>",ENVIRON[map[i]]) }
{ print }' file
类似于第一个解决方案中的sed
,我添加了一种确保不将字符串NAME1FOO
替换为ENVIRONMENT_NAME1FOO
的方法。通过在正则表达式中添加word_boundaries /<
和/>
。
**注意:此方法可能会创建循环。假设您有一个环境变量:
ENVIRONMENT_NAME1="NAME2"
然后将字符串NAME1
替换为ENVIRONMENT_NAME2
的内容。我说 might 是因为一切都取决于awk相关的for循环中的横向顺序。