shell bash,cat文件,同时使用sed替换文本

时间:2014-01-20 15:01:41

标签: string shell sed grep cat

在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

1 个答案:

答案 0 :(得分:1)

虽然[在双引号bash字符串中没有任何特殊含义,但\[仍会计算为[,因为反斜杠会被处理以允许转义美元符号。尝试

sed "s|\\[#${key}#\\]|${value}|g"

作为sed命令。双反斜杠会导致文字反斜杠被发送到sed[将使用它来转义{{1}}以对其进行字面处理。