用变量替换bsh中的SED,变量是存储在数组

时间:2016-11-14 23:27:14

标签: bash sed

基本上有一个"模板"文件我想填写一些其他辅助文件的内容,基本上是一个数字和字母矩阵。我做了其他替换,但是这个是惹麻烦的。

在模板文件中,我放了"%标签"在我想要用辅助文件替换的地方。然后我使用这个脚本进行替换:

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

在这种情况下,我不会收到错误警告并进行替换,但没有换行符。

有没有办法让替换保持换行符?

谢谢。

1 个答案:

答案 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