bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.htmlphp
test.xml文件很大,内容结构以下:html
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<url>
<loc>http://www.u1cat.net/index.php?ctl=register</loc>
<lastmod>2016-10-31</lastmod>
<changefreq>always</changefreq>
<priority>aaa</priority>
</url>
<url>
<loc>http://www.u2bat.cc/index.php?ctl=register</loc>
<lastmod>2015-11-18</lastmod>
<changefreq>always</changefreq>
<priority>bbb</priority>
</url>
<url>
<loc>http://www.u3bat.cc/index.php?ctl=register</loc>
<lastmod>2015-11-18</lastmod>
<changefreq>always</changefreq>
<priority>ccc</priority>
</url>
<url>
<loc>http://www.u4bat.cc/index.php?ctl=register</loc>
<lastmod>2015-11-18</lastmod>
<changefreq>always</changefreq>
<priority>ddd</priority>
</url>
<url>
<loc>http://www.u5bat.cc/index.php?ctl=register</loc>
<lastmod>2015-11-18</lastmod>
<changefreq>always</changefreq>
<priority>ddd</priority>
</url>
......
list.txt文件较小,内容以下:shell
bbb
xxx
yyy
ccc
需求是,若是<url>...</url>
中间包含了list.txt文件中的某一行,则删除这个<url>...</url>
。bash
在这里须要说明下sed的局限性:
(1).sed处理输入流是一次性的,只要某行被sed读取了,就必定不会再读取。所以,读取到某知足匹配要求的行时,没法定位到它前面的某行、某几行。
(2).sed自身没有显式的循环结构,例如while、for、until。可是经过某些功能的结合,能够隐式地实现循环。据我总结,只有标签跳转和"NDP"才能实现这种隐式意义上的循环。
(3).sed和system命令交互的局限性很是大。只有e命令和s命令的e修饰符才能执行system中的命令。
正是这3个局限性,致使sed实现上面的需求很是困难。url
如下是一种效率很是高的方法:只读取一次test.xml和list.txt文件,并在每次读取到<url>...</url>
的时候判断是否须要删除这一段。spa
建立sed脚本文件a.sed:.net
#!/usr/bin/sed -nf
\%<url>%!p
1{s/.*/cat list.txt/e;h}
\%<url>%{
N;N;N;N;N;G;
\%<priority>(.*)</priority>.*\1.*%d } s%</url>.*%</url>%p
执行sed:code
sed -rn -f a.sed test.xml
因为上面示例文件中<priority>bbb</priority>
和<priority>ccc</priority>
的bbb、ccc存在于list.txt文件中,所以这两个<url>...</url>
段落要删除。执行结果为:regexp
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<url>
<loc>http://www.u1cat.net/index.php?ctl=register</loc>
<lastmod>2016-10-31</lastmod>
<changefreq>always</changefreq>
<priority>aaa</priority>
</url>
<url>
<loc>http://www.u4bat.cc/index.php?ctl=register</loc>
<lastmod>2015-11-18</lastmod>
<changefreq>always</changefreq>
<priority>ddd</priority>
</url>
<url>
<loc>http://www.u5bat.cc/index.php?ctl=register</loc>
<lastmod>2015-11-18</lastmod>
<changefreq>always</changefreq>
<priority>ddd</priority>
</url>
思路大体为:xml