2012-02-10 11 views
2
#!/bin/sh 
old="hello" 
new="world" 
sed -i s/"${old}"/"${new}"/g $(grep "${old}" -rl *) 

上面的腳本只是單行文本工作,我怎麼可以編寫一個腳本可以代替 多行文本的多行字符串。如何更換在一堆文件

old='line1 
line2 
line3' 

new='newtext1 
newtext2' 

我可以使用什麼命令。

+0

[sed和awk:如何將一段文件替換爲另一個內容的可能的重複?](http://stackoverflow.com/questions/4311915/sed-and-awk-how-to-replace-a-section-的文件到另一個內容) – parvus 2013-10-17 05:38:44

回答

1

awk可以爲你做到這一點。

awk 'BEGIN { RS="" } 
    FILENAME==ARGV[1] { s=$0 } 
    FILENAME==ARGV[2] { r=$0 } 
    FILENAME==ARGV[3] { sub(s,r) ; print } 
' FILE_WITH_CONTENTS_OF_OLD FILE_WITH_CONTENTS_OF_NEW ORIGINALFILE > NEWFILE 

但是你可以用vimlike described here(編寫腳本的解決方案)做到這一點。

另請參閱sed faq中的thisthis

1

你可以用perl或awk和更改記錄分隔符的東西比其他換行符(這樣你就可以對陣更大的塊例如使用awk:

echo -e "one\ntwo\nthree" | awk 'BEGIN{RS="\n\n"} sub(/two\nthree\n, "foo")' 

或用Perl(-00 ==段緩衝模式)

echo -e "one\ntwo\nthree" | perl -00 -pne 's/two\nthree/foo/' 

我不知道是否有可能有根本沒有記錄分隔符(用Perl,你可以先閱讀整個文件,但話又說回來,這不是很好至於內存使用)

相關問題