在bash中使用变量替换SED,该变量是存储在数组中的另一个文件的内容
基本上,我有一个“模板”文件,我想用一些其他辅助文件的内容来填充,这些文件基本上是数字和字母的矩阵。我做了其他的替换,但这一个给我带来了麻烦 在模板文件中,我将“%label”放在了我想用辅助文件进行替换的位置。然后我使用此脚本进行替换:在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/${
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);是否
mapfile谢谢。问题在于,
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分隔符更改为逗号,但我一直收到相同的错误。