2014-01-20 89 views
0

在SO的帮助下,我已经能够纠正我的sed命令,所以我可以使用变量(使用'而不是'并且不使用g作为全局变量)。使用sed替换文本的shell bash,cat文件

不过,我挣扎着爬命令才能正常工作。

给你一些情况下,我有一个包含文本和一些行包含一个或多个标签的众多行的文件。这些标签在以下格式:

[#$key#] - i.e #[#] is used to indicate the presence of a key 

然后我有一个内部数组对象t内存储包含每个键,按以下格式的相应值的字符串值:

$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,但我的版本似乎不支持,我

+1

不需要'cat file | sed> new_file'。相反,请执行'sed ... file> new_file'。 – fedorqui

+1

您似乎对设置'key'和'value'的行有问题,我认为这会导致一些错误。 – chepner

+0

键和值变量是预期的 - 已经echo'd他们来仔细检查 –

回答

1

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

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

作为您的sed命令。双反斜杠将导致一个文字反斜杠被发送到sed,它将使用它来逃避[来处理它。

+0

我的版本(在solaris上)不支持-i恐怕 –

+0

当我在脚本上使用set -xv时,它似乎将grep中的$ key字符串解释为* \ [\#\ e \ x \ a \ m \ p \ l \ e \ _ \ k \ e \ y \#\] *而不是[#example_key#] –