2011-09-13 146 views
2

如果我寫一個bash腳本做了一堆文件,我想改變線的就地編輯是一樣的東西:猛砸文件量備用

#include <foo/bar.h>

#include "bar.h"

語法是什麼?

old='#include <foo/bar.h>' 
new='#include "bar.h' 
perl -pe -i.bak 's/$old/$new/g' baz.h 
+0

你想這樣做在bash,或者在Perl?你的問題說bash,但你的例子說perl。 – Flimzy

+0

它是一個更大的bash文件的一部分,它抓取多個文件中的位並改變它們。我的問題是這一個perl行,應該preform一個就地編輯文件baz.h我想我需要一些轉義字符或在新舊 – Newbie

+0

是的,你會有一些逃避問題,因爲你的$舊包含'/'字符。如果您使用其他字符作爲您的正則表達式終止符,那麼這將工作......也許是@ ... @ ... @',正如我在以下答案中所用的那樣。 – Flimzy

回答

2

如果所有的文件都在同一目錄中,這應該工作:

sed -e '[email protected]#include <foo/bar.h>@#include "bar.h"@' -i *.c 
+0

'sed -e's @ $ old @ $ new @'-i $ current'似乎沒有改變目標文件中的任何內容。他們仍然有原始的線條。 – Newbie

+0

如果引用變量,則可能需要使用「而不是」標記,否則$ old和$ new將被直接替換,而不是展開。 – Flimzy

+0

@Newbie,使用雙引號,而不是單引號。單引號可以防止變量被替換 –

1

猛砸

for file in *.c 
do 
    while read -r line 
    do 
     case "$line" in 
     *"$old"*) line="${line/$old/$new}" 
     esac 
     echo "$line" 
    done < "$file" > tempo && mv tempo "$file" 
done 
+0

這並不完全適用於我的大型程序......它運行在幾個嵌套循環內,它的文件是工作正在改變,以及它正在取代的價值 – Newbie

+0

這也是一個非常複雜的方式來做到這一點...但它是_is_純粹的bash,不像我的答案...所以如果你真的想要一個_bash_答案,這可能是一個wins。 – Flimzy

+0

不是很複雜,while循環和'sed'/ old/new /'文件一樣,把while循環放到bash函數中,並調用這個函數'sed',它的作用是一樣的:) –