2012-07-18 36 views
2

在shell中工作我想在我的文本文件(表格)中取出所有「replace_me」實例,並將其替換爲另一個文件中的值(標記),在列表中遞增地工作。使用循環從列表中替換具有不同短語的單個短語

即表中的「replace_me」的第一個實例將被來自標記的「replaced_1」替換,第二個被「replaced_2」替換,直到列表被用盡。

環顧其他答案我認爲它應該像嵌套循環(對於,然後如果),沿着這些線,但我不知道如何使其實際工作,並逐步向下移動'標記'列表。

#!/bin/bash 
fileReplace='markers' 
fileChange='table' 
linesreplace=`cat $fileReplace` 
lineschange=`cat $fileChange` 

for line in $lineschange ; do 

if $linechange = "replace_me" 
sed "s/{$lineschange}/{$linesreplace}/g" 
else 
done 

我敢肯定,這是基本的,所以在正確的方向或示例非常受歡迎。

+0

被'replace_me'一整行?你會對ViM中的解決方案感興趣嗎? – Shahbaz 2012-07-18 21:39:30

+0

爲什麼你將搜索和替換字符串分開?一個文件會更有意義。 – 2012-07-18 21:39:46

+0

縮進是您(和我們)的朋友。 – 2012-07-19 02:12:28

回答

0

假設你知道replaceme東西的數量,解決方案應該是這樣的:

for i in {1..5}; do 
linesreplace= `head -${i} runjavareplicate.sh | tail -1` 
sed -i "s/${linechange}/${linesreplace}/" filename 
done 
+0

如果你發現自己在做'head |尾巴'在一個循環中,你做錯了。 – 2012-07-19 02:14:48

0

根據你的問題聽起來好像它是合理的假設該文件具有相同的行數。希望評論充分解釋這裏發生了什麼:

#!/bin/bash 

fileReplace='markers' 
fileChange='table' 
IFS=$'\n' # 'Internal Field Separator' affects how bash splits words (i.e. for arrays). 
linesreplace=($(<"$fileReplace")) # Create a bash array from the lines of each file 
lineschange=($(<"$fileChange")) 

for ((i=0; i<"${#linesreplace[@]}"; i++)); do # iterate numerically over the lines 
    line="${lineschange[i]}" 
    case "$line" in 
     replace_me) 
      printf '%s\n' "${linesreplace[i]}" # Print out the replaced line 
     *) 
      printf '%s\n' "$line" # Print out the original line 
    esac 
done 
+0

是的文件有相同的行。我在上面找到了一個解決方案,但是我稍後會嘗試這個,因爲你很樂意花時間對所有內容進行精美的註釋,我一定會學到一些東西!稍後會反饋意見,謝謝。 – jksl 2012-07-19 08:29:58

2

將下一個腳本保存到文件中,例如, do_replace.sh

replace_me="replace_me" 
while read replace_to 
do 
    sed -i "" "1,/$replace_me/s/$replace_me/$replace_to/" $1 
done 

並與運行:

sh do_replace.sh file_where_need_replace.txt < file_with_replacements 

例如從file_where_need_replace

aaa aaa aaa 
replace_me bbb bbb 
ccc ccc ccc 
ddd replace_me ddd 
eee eee eee 
fff fff replace_me 

與如下替換:

111 
222 
333 

會產生:

aaa aaa aaa 
111 bbb bbb 
ccc ccc ccc 
ddd 222 ddd 
eee eee eee 
fff fff 333 

或簡單的perl:

perl -ple 'BEGIN{@x=qx(cat replacements.txt);chomp @x}s/replace_me/shift(@x)/e' < where_to_replace.txt 
+0

謝謝。我嘗試使用我的數據,然後使用您提供的示例創建的文件,然後出現錯誤消息: 「sed:can not read 1,/ replace_me/s/replace_me/111 /:沒有這樣的文件或目錄「。我現在嘗試第二個例子。 – jksl 2012-07-19 08:05:37

+0

你確定你沒有忘記「引號」嗎? perl示例的作品爲 – jm666 2012-07-19 08:08:51

+0

!可愛。非常感謝 – jksl 2012-07-19 08:10:25