【问题标题】:bash: Search/replace for strings matching ${FOO}-style patterns literallybash:搜索/替换与 ${FOO} 样式匹配的字符串
【发布时间】:2012-04-11 00:38:03
【问题描述】:

我正在构建一个 bash 脚本,例如,我想将“${PRODUCT_NAME}”替换为“WORD”。 问题是“$”,在 bash 中 $ 代表一个参数,所以当我运行脚本时

echo "Replace ${PRODUCT_NAME} with $1 in document.txt"

for file in $(grep -il ${PRODUCT_NAME} ~/Documents/tmp/document.txt)   
do   
   sed -e "s/${PRODUCT_NAME}/$3/g" $file > /tmp/tempfile.tmp   
   mv /tmp/tempfile.tmp $file   
done   

脚本将 ${PRODUCT_NAME} 识别为参数,而不是我要替换的单词。我如何让它识别“${PRODUCT_NAME}”是一个词而不是一个参数,所以我可以替换它?

【问题讨论】:

  • 您可能想提及您想替换 literal 出现的 ${PRODUCT_NAME} 而不是那个 Bash 变量的值...
  • 这就是我使用引号的原因。

标签: bash unix replace grep arguments


【解决方案1】:

首先,请注意您的sed 脚本实际上需要使用\${PRODUCT_NAME} 而不是${PRODUCT_NAME} 作为搜索模式,因为在POSIX 基本正则表达式中,$ 表示“行尾”而不是比“美元符号”。那不碍事。 . .

在 Bash 中,您可以使用反斜杠引用美元符号:

echo "Replace \${PRODUCT_NAME} with $1 in document.txt"

for file in $(grep -il ${PRODUCT_NAME} ~/Documents/tmp/document.txt)
do
   sed -e "s/\\\${PRODUCT_NAME}/$3/g" $file > /tmp/tempfile.tmp
   mv /tmp/tempfile.tmp $file
done

或者使用单引号(类似于双引号,只是它们不允许基于 $ 的扩展,并且不处理 \):

echo 'Replace ${PRODUCT_NAME} with '"$1 in document.txt"

for file in $(grep -il ${PRODUCT_NAME} ~/Documents/tmp/document.txt)
do
   sed -e 's/\${PRODUCT_NAME}/'"$3/g" $file > /tmp/tempfile.tmp
   mv /tmp/tempfile.tmp $file
done

(顺便说一句,您的echo 行使用$1 而您的sed 行使用$3 是故意的吗?看起来他们应该都使用相同的参数。)

【讨论】:

  • 谢谢你!它有效,您忘记了 grep 命令中的反斜杠
猜你喜欢
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 2021-01-26
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
相关资源
最近更新 更多