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

 

posted on 2014-08-14 14:13  在学习路上  阅读(11317)  评论(0编辑  收藏  举报