2011-11-02 116 views
2

我在文本文件中有大量單詞要替換。使用sed在bash中找到並替換for循環

此腳本工作直到sed命令從哪裏獲得:

的sed:1: 「* .js文件」:無效的命令代碼*

PS ...猛砸ISN」的T我的強項之一 - 這並不需要是相當的或有效的

cd '/Users/xxxxxx/Sites/xxxxxx' 
    echo `pwd`; 

    for line in `cat myFile.txt` 
    do 
     export IFS=":" 
     i=0 
     list=() 

     for word in $line; do 
      list[$i]=$word 
      i=$[i+1] 
     done 

     echo ${list[0]} 
     echo ${list[1]} 

     sed -i "s/{$list[0]}/{$list[1]}/g" *.js 

    done 
+2

作爲一種風格,'echo \'pwd''是無用的Echo使用;只是'pwd'將打印當前的工作目錄。同樣,在反引號中運行'for'循環'cat'就是一個無用的貓。另見http://partmaps.org/era/unix/award.html – tripleee

回答

2

您正在運行BSD的sed(下OS X),因此-i標誌需要一個參數指定你想要的後綴是什麼。

此外,沒有文件匹配glob *.js

1

這看起來像一個簡單的拼寫錯誤:

sed -i "s/{$list[0]}/{$list[1]}/g" *.js 

應該是:

sed -i "s/${list[0]}/${list[1]}/g" *.js 

(就像上面的echo線)

+0

謝謝,有一個錯字。 –

1

所以myFile.txt包含的列表:要換人,並且你正在循環每一個。爲什麼不用這個文件創建sed腳本呢?

cd '/Users/xxxxxx/Sites/xxxxxx' 
sed -e 's/^/s:/' -e 's/$/:/' myFile.txt | 
# Output from first sed script is a sed script! 
# It contains substitutions like this: 
# s:from:to: 
# s:other:substitute: 
sed -f - -i~ *.js 

sed可能不喜歡-f -這意味着sed應該從標準輸入讀取它的腳本。如果是這樣的話,也許你可以創建一個像這樣的臨時腳本;

sed -e 's/^/s:/' -e 's/$/:/' myFile.txt >script.sed 
sed -f script.sed -i~ *.js 
0

另一種方法,如果你不覺得非常有信心SED,並認爲你會在一個星期忘記了巫術符號的含義,可能是一個更有效的方式使用IFS什麼:

IFS=":" 
cat myFile.txt | while read PATTERN REPLACEMENT # You feed the while loop with stdout lines and read fields separated by ":" 
do 
    sed -i "s/${PATTERN}/${REPLACEMENT}/g" 
done 

我可以看到的唯一缺陷(可能更多)是,如果PATTERN或REPLACEMENT是否包含斜槓(/),它們將銷燬您的sed表達式。 您可以使用不可打印的字符來更改sed分隔符,並且應該是安全的。 無論如何,如果你知道你的myFile.txt有什麼你可以使用任何。