在SO的帮助下,我已经能够纠正我的sed命令,因此我可以使用变量(使用'代替'而不是使用g代表全局)。
但是,我正在努力让命令正常工作。
为了给你一些上下文,我有一个包含多行文本的文件,一些行包含一个或多个标签。这些标签采用以下格式:
[#$key#] - i.e #[#] is used to indicate the presence of a key
然后我有一个内部数组对象,它存储一个字符串值,其中包含每个键和一个相应的值,格式如下:
$key=$value
我要做的是在使用全局sed替换来交换数组对象中相应值的$ key的同时捕获包含标记的文件。
我遇到的问题是我的grep / sed命令没有替换任何文本,我无法弄清楚原因。
这是我的代码:
for x in "${prop[@]}"
do
key=`echo "${x}" | cut -d '=' -f 1`
value=`echo "${x}" | cut -d '=' -f 2`
# global replace on the $MY_FILE
cat $MY_FILE | sed "s|\[#${key}#\]|${value}|g" > ${TEMP_MY_FILE}
cat $TEMP_MY_FILE > $MY_FILE
done
我考虑过使用sed -i,但我的版本似乎不支持-i
答案 0 :(得分:1)
虽然[
在双引号bash字符串中没有任何特殊含义,但\[
仍会计算为[
,因为反斜杠会被处理以允许转义美元符号。尝试
sed "s|\\[#${key}#\\]|${value}|g"
作为sed
命令。双反斜杠会导致文字反斜杠被发送到sed
,[
将使用它来转义{{1}}以对其进行字面处理。