2016-11-14 38 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