2012-05-14 43 views
6

我想在多行如要替換的文件一行替換多行線在一個文件

我想更換一個特定的函數調用說
foo(1,2)

if (a > 1) { 
    foo(1,2) 
} else { 
    bar(1,2) 
} 

我該怎麼做bash?

+0

如果我想就地改變它在我目前的文件,而不產生任何額外的文件。 – ravi

+0

@ravi查看我的編輯。 –

回答

6

這是sed的s命令是爲建:

shopt -s extglob 

ORIG="foo(1,2)" 
REP="if (a > 1) { 
     foo(1,2) 
} else { 
     bar(1,2) 
}" 

REP="${REP//+(
)/\\n}" 

sed "s/$ORIG/$REP/g" inputfile > outputfile 

注意,REP="${REP//\+( )/\\n}"線只需要如果要定義,我在第二行做了格式化的方式REP 。如果您剛剛在REP中使用\n\t開頭,可能會更簡單。響應OP的問題

編輯

要更改原始文件,而無需創建一個新的文件,用sed的--in-place標誌,就像這樣:

sed --in-place "s/$ORIG/$REP/g" inputfile 

請小心使用--in-place標誌。在運行之前進行備份,因爲所有更改都是永久性的。

+1

'shopt -s extglob'是必需的,加號前的反斜槓需要刪除。 –

+0

@DennisWilliamson感謝您的支持。我有時會忘記,大多數人沒有默認開啓延長的通配符。反斜槓只是從測試中剩下的。 –

+0

它正在工作,但我不確定這是什麼意思 'REP =「$ {REP // +( )/ \\ n}」' – ravi

1
ORIGINAL="foo(1,2)" 
REPLACEMENT="if (a > 1) { 
foo(1,2) 
} else { 
bar(1,2) 
}" 

while read line; do 
    if [ "$line" = "$ORIGINAL" ]; then 
    echo "$REPLACEMENT" 
    else 
    echo "$line" 
    fi 
done </path/to/your/file> /path/to/output/file 
0

這可能會爲你工作:

cat <<\! | 
> a 
> foo(1,2) 
> b 
> foo(1,2) 
> c 
> ! 
> sed '/foo(1,2)/c\ 
> if (a > 1) {\ 
>  foo(1,2)\ 
> } else {\ 
>  bar(1,2)\ 
> }' 
a 
if (a > 1) { 
    foo(1,2) 
} else { 
    bar(1,2) 
} 
b 
if (a > 1) { 
    foo(1,2) 
} else { 
    bar(1,2) 
} 
c