#!/bin/sh
old="hello"
new="world"
sed -i s/"${old}"/"${new}"/g $(grep "${old}" -rl *)
上面的腳本只是單行文本工作,我怎麼可以編寫一個腳本可以代替 多行文本的多行字符串。如何更換在一堆文件
old='line1
line2
line3'
new='newtext1
newtext2'
我可以使用什麼命令。
#!/bin/sh
old="hello"
new="world"
sed -i s/"${old}"/"${new}"/g $(grep "${old}" -rl *)
上面的腳本只是單行文本工作,我怎麼可以編寫一個腳本可以代替 多行文本的多行字符串。如何更換在一堆文件
old='line1
line2
line3'
new='newtext1
newtext2'
我可以使用什麼命令。
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
但是你可以用vim
like described here(編寫腳本的解決方案)做到這一點。
你可以用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,你可以先閱讀整個文件,但話又說回來,這不是很好至於內存使用)
[sed和awk:如何將一段文件替換爲另一個內容的可能的重複?](http://stackoverflow.com/questions/4311915/sed-and-awk-how-to-replace-a-section-的文件到另一個內容) – parvus 2013-10-17 05:38:44