基本上有一个"模板"文件我想填写一些其他辅助文件的内容,基本上是一个数字和字母矩阵。我做了其他替换,但是这个是惹麻烦的。
在模板文件中,我放了"%标签"在我想要用辅助文件替换的地方。然后我使用这个脚本进行替换:
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
(&#34; file_list&#34;包含文件&#39;名称)但我一直收到错误&#34; sed:-e表达式#3,字符58:未终止的&#39;命令&#34;
我也尝试过这种脚本来做到这一点:
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
在这种情况下,我不会收到错误警告并进行替换,但没有换行符。
有没有办法让替换保持换行符?
谢谢。
答案 0 :(得分:1)
问题是sed
需要出现分隔符,并且s///
的替换字符串中的换行符出现时会使用反斜杠进行转义。问题中报告的错误是由于包含替换字符串的文件中的换行符所致。
在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