sed中的多行匹配,可以用N,N的意思是把下一行寫入保持空間,保持空間可能不好理解,可以理解為機器的內存一樣,把一下行也寫入內存,可能會好理解多了,當把一下行也寫入保持空間的時間,轉行符"\n",也可以用.*匹配到了,前幾天在幫開發做全局替換,在一對php標簽中,替換里面的兩行內容,其他有兩個字段組合起來就是整個頁面都是唯一的
<?php
$_web = str_replace(array('s-','www.'),'',$_web);\
$_webcontents = file_get_contents("http://test.com/index.php?url=".$_web);
?>
內容大概就是上面的東西
替換腳本
#!/bin/bash
cd /usr/local/nginx/html/mytest/
for i in `ls -d test*`
do
grep file_get_contents ${i}/vip.dwt &>/dev/null && s=0||s=1
if [ $s -eq 0 ];then
sed -i '
/<\?php/{ ###匹配<?php
N ###把下一行寫入保持空間,(用內存表達會好理解些)
/<\?php.*str_replace/{ ###然后再把<?php與這么里的關鍵字進行匹配,這里的.*已經可以匹配到"\n"
N ###再把下一行寫入保持空間
/<\?php.*str_replace.*file_get_contents/{ ###把上面匹配到的兩個再加上這一行進行匹配
/.*str_replace.*file_get_contents.*/c\ ###開始替換的東西,用c,\是表示換行,替換的東西不用做轉義
<?php \
function curl_get_contents($url,$timeout=1) { \
$curlHandle = curl_init(); \
curl_setopt( $curlHandle , CURLOPT_URL, $url ); \
curl_setopt( $curlHandle , CURLOPT_RETURNTRANSFER, 1 ); \
curl_setopt( $curlHandle , CURLOPT_TIMEOUT, $timeout ); \
$result = curl_exec( $curlHandle ); \
curl_close( $curlHandle ); \
return $result; \
}\
$_web = str_replace(array('s-','www.'),'',$_web);\ ###這里得注意了,如果是用單引號,這里替換后單引號會沒有,改成雙引號就不存在問題
$_webcontents = curl_get_contents("http://test.com/index.php?url=".$_web);
}
}
}' ${i}/vip.dwt
fi
cd /usr/local/nginx/html/mytest/
done
上面的代碼,大概意思就是,進入目錄,查找有test的文件夾,然后進行循環,查找文件夾里vip.dwt文件,里能找出,則s=0,再進行替換.