簡體   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