2016-11-14 37 views
1

基本上有一个“模板”文件我想填充一些其他辅助文件的内容,它们基本上是一个矩阵的数字和字母。我做了其他替代品,但这是一件麻烦事。SED用bash替换变量,变量是存储在数组中的另一个文件的内容

在模板文件中,我将“%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 

(“file_list中”包含文件的名称),但我不断收到错误“的sed:-e表达式#3,焦炭58:未结束的'S'命令”。

我也试过这种脚本来做到这一点:

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

根本的问题是,无论'$ {数组[$ i]}'得到由壳扩大到受'sed'语法,这意味着如果在文件名中'file_list.txt'是包含斜线的路径(因为这是您在'sed'表达式中用作分隔符的地方),或者是从sed'的角度来看替换失败的任何其他特殊字符。 –

+0

谢谢你的回答,@AdrianFrühwirth。 我的文件名此刻不包含反斜杠。此外,当我使用“mapfile”时,我没有得到任何错误。 虽然我尝试将sed分隔符更改为逗号,但我仍然收到相同的错误。 –

回答

1

问题是sed需要出现分隔符字符,并且s///的替换字符串中的换行符出现时会出现反斜杠。问题中报告的错误是由于包含替换字符串的文件中的换行符。

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

由于您使用的是Bash,因此您不需要使用sed或任何其他外部命令。试试这个纯猛砸代码:

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