繁体   English   中英

sed | 用包含双引号的环境变量替换值

[英]sed | replace value with environment variable containing double quotes

我的环境变量包含双引号如下:

$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

我尝试使用以下命令将 JAAS_CONF 替换为 env 变量:

 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' 的未知选项

有关如何解决此问题的任何提示?

更新:

注意

  • “密码”包含“/”字符
  • CONNECT_CONSUMER_SASL_JAAS_CONFIG 末尾有一个换行符
  • 我需要再次逃离两双。

所以最后我的解决方案是:

  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

似乎您正在调用错误的变量名称“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

您确定 $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

要查看如何在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命令模式分为 3 部分...... `s|JAAS_CONF|' + "${变量}" + '|g;'
  • 对第一和​​第三部分使用单引号或双引号提供了相同的结果(在这种情况下)

使用envsubst

假设你有一个字符串STRING ,你想用变量VARIABLE_STRING替换它。 然后我会建议以下方法:

  1. 用适当的 shell 变量名称替换所有感兴趣的变量(包括$
  2. export所有感兴趣的变量
  3. 使用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] 仅用 envsubst 替换特定变量以获取更多信息。

使用 GNU awk:

如果你不能使用envsubst ,你可以用 awk 写一些东西。 GNU awk 可以使用ENVIRON数组访问环境,该数组是从变量名到变量值的映射。 例子:

awk 'BEGIN{print ENVIRON["HOME"]}' 

这将打印$HOME的内容

所以现在你可以是这样的:

  1. 从字符串创建映射以替换到环境中
  2. 循环名称:

这看起来像这样:

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的内容。 我说可能是因为一切都取决于 awk 依赖的 for 循环中的横向顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM