Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
shell bash全局替换文件_Bash_Shell_Replace_Sed_Grep - Fatal编程技术网

shell bash全局替换文件

shell bash全局替换文件,bash,shell,replace,sed,grep,Bash,Shell,Replace,Sed,Grep,我想知道如何对文件进行全局替换 基本上,我有一个包含多个属性的文件,我在这个文件中循环创建一个数组来存储每个属性值。属性值以以下格式存储: $key=$value 所以我要做的是循环遍历我的属性数组,并用相应的值替换文件中的所有键。如果使用以下格式,则按键将高亮显示: [#$key#] 因此,我尝试在数组中循环,并对每个元素在我的文件中进行全局替换,方法是使用sed将键的所有实例(在[##]标记中)替换为该值,从而对临时文件进行分类。然后,我会将临时文件恢复为原始文件 然而,我所拥有的并不是

我想知道如何对文件进行全局替换

基本上,我有一个包含多个属性的文件,我在这个文件中循环创建一个数组来存储每个属性值。属性值以以下格式存储:

$key=$value
所以我要做的是循环遍历我的属性数组,并用相应的值替换文件中的所有键。如果使用以下格式,则按键将高亮显示:

[#$key#]
因此,我尝试在数组中循环,并对每个元素在我的文件中进行全局替换,方法是使用sed将键的所有实例(在[##]标记中)替换为该值,从而对临时文件进行分类。然后,我会将临时文件恢复为原始文件

然而,我所拥有的并不是替换所有元素,即不是全局替换

以下是我到目前为止的情况:

for x in "${props[@]}"
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/ > $TEMP_MY_FILE
    cat $TEMP_MY_FILE > $MY_FILE

done
任何帮助都将不胜感激

请尝试以下方法:

for x in "${props[@]}"
do
    key='echo "${x}" | cut -d '=' -f 1
    value='echo "${x}" | cut -d '=' -f 2

    # global replace on the $MY_FILE
    sed -i "s/#$key#/$value/g" $MY_FILE
done

sed-i
直接在文件中进行修改,而不使用临时文件

增强h3nr1x的帖子我们可以尝试以下方法:

SED_CMD=""
for x in "${props[@]}"
do
    key=$(echo "${x}" | cut -d '=' -f 1)
    value=$(echo "${x}" | cut -d '=' -f 2)
    SED_CMD="${SED_CMD}s/#$key#/$value/g
"
done
# global replace on the $MY_FILE
sed -i "$SED_CMD" $MY_FILE
sed命令将仅在文件上直接执行一次。
注意:在将值附加到SED\u CMD变量的语句中,结束双引号必须位于下一行的开头,以便在每个SED命令后插入新行。

对于全局替换,请说
SED s/'\[\\\$key\]/$value/g