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,再进行替换.