在bash中使用变量替换SED,该变量是存储在数组中的另一个文件的内容

在bash中使用变量替换SED,该变量是存储在数组中的另一个文件的内容,bash,sed,Bash,Sed,基本上,我有一个“模板”文件,我想用一些其他辅助文件的内容来填充,这些文件基本上是数字和字母的矩阵。我做了其他的替换,但这一个给我带来了麻烦 在模板文件中,我将“%label”放在了我想用辅助文件进行替换的位置。然后我使用此脚本进行替换: for i in $(cat file_list.txt); do array[$i]=$(<file_$i.txt) done for i in $(cat file_list.txt); do sed -e "s/%label/${

基本上,我有一个“模板”文件,我想用一些其他辅助文件的内容来填充,这些文件基本上是数字和字母的矩阵。我做了其他的替换,但这一个给我带来了麻烦

在模板文件中,我将“%label”放在了我想用辅助文件进行替换的位置。然后我使用此脚本进行替换:

for i in $(cat file_list.txt); do
    array[$i]=$(<file_$i.txt)
done

for i in $(cat file_list.txt); do
    sed -e "s/%label/${array[$i]}/g"< template.txt > final_file_$i.txt
done
以美元表示的i的
(cat文件\u list.txt);做
数组[$i]=$(最终文件\uu$i.txt
完成
(“file_list”包含文件名),但我一直收到错误“sed:-e expression#3,char 58:unterminated`s'command”

我也尝试过这样的脚本:

for i in $(cat file_list.txt); do
    mapfile < file_$i.txt   
    array[$i]=${MAPFILE[@]}
done

for i in $(cat file_list.txt); do
    sed -e "s/%label/${array[$i]}/g"< template.txt > final_file_$i.txt
done
<代码>对于$中的i(cat file_list.txt);是否 mapfilefinal_file_$i.txt 完成 在这种情况下,我没有收到错误警告,并且进行了替换,但是没有换行符

有没有办法让换人保持换人状态


谢谢。

问题在于,
sed
要求使用反斜杠转义替换字符串中出现的分隔符和换行符。问题中报告的错误是由于包含替换字符串的文件中出现了换行符

对于
s//
命令,在模式或替换字符串中使用变量通常不是一个好主意

由于您使用的是Bash,因此不需要为此使用
sed
或任何其他外部命令。请尝试以下纯Bash代码:

template=$(< template.txt)
for id in $(< file_list.txt) ; do
    contents=$(< "file_$id.txt")
    final_contents=${template//%label/"$contents"}
    printf '%s\n' "$final_contents" > "final_file_$id.txt"
done
template=$(“final\u file\u$id.txt”
完成

潜在的问题是,shell扩展到的
${array[$i]}
都要遵循
sed
语法,这意味着如果
file\u list.txt
中的文件名是包含斜杠的路径(因为在
sed
-表达式中使用斜杠作为分隔符)或者从
sed
的角度来看,任何其他特殊字符的替换都失败了。谢谢你的回答,@AdrianFrühwirth。我的文件名目前不包含反斜杠。此外,当我使用“mapfile”时,我没有收到任何错误。虽然我尝试将sed分隔符更改为逗号,但我一直收到相同的错误。