sed 匹配,sed匹配邮箱

hacker2022-09-27黑客组织194

一个sed的问题,怎样进行多行条件匹配

2.txt

AAA BBB CCC DDD

AAA BBB DDD

CCC DDD

#sed -n '/AAA/p' 2.txt |sed -n '/CCC/p'

Linux:sed模式匹配,这段是如何匹配的呢?

\(\)括起来的是捕获组,你可以在后面的替换中用\1 \2 之类的来调用

.表示任意一个字符

*表示*前面出现的那个字符重复0或任意次

你写8,第一个捕获组捕获0个字符,第二个捕获组捕获一个字符

请教个sed匹配替换的问题

看你的需求,我想大概是判断每个url/url中priorityXXXX/priority的XXXX是否存在于list文件中。如果存在,则删除这个url/url段落。

假设你的test.xml文件的格式比较标准,每个url.../url段落内部都有4行,且其中一行是priority.../priority,必须符合这两个条件,否则要按需改代码:

那么,新建一个a.sed文件,内容如下:

01 #!/usr/bin/sed -nf

02

03 \%url%!p

04 1{s/.*/cat list.txt/e;h}

05

06 \%url%{

07 N;N;N;N;N;G;

08 \%priority(.*)/priority.*\1.*%d

09 }

10

11 s%/url.*%/url%p

再执行:

复制内容到剪贴板

代码:

sed -rn -f a.sed test.xml

以下是我的示例,list.txt文件内容如下:

复制内容到剪贴板

代码:

bbb

xxx

yyy

ccc

test.xml的内容如下:

复制内容到剪贴板

代码:

?xml version="1.0" encoding="UTF-8" standalone="no"?

url

loc;/loc

lastmod2016-10-31/lastmod

changefreqalways/changefreq

priorityaaa/priority

/url

url

loc;/loc

lastmod2015-11-18/lastmod

changefreqalways/changefreq

prioritybbb/priority

/url

url

loc;/loc

lastmod2015-11-18/lastmod

changefreqalways/changefreq

priorityccc/priority

/url

url

loc;/loc

lastmod2015-11-18/lastmod

changefreqalways/changefreq

priorityddd/priority

/url

url

loc;/loc

lastmod2015-11-18/lastmod

changefreqalways/changefreq

priorityddd/priority

/url

其中prioritybbb/priority和priorityccc/priority中的bbb、ccc存在于list文件中,所以删除这两个url....../url段,其他的保留。

执行结果为:

复制内容到剪贴板

代码:

?xml version="1.0" encoding="UTF-8" standalone="no"?

url

loc;/loc

lastmod2016-10-31/lastmod

changefreqalways/changefreq

priorityaaa/priority

/url

url

loc;/loc

lastmod2015-11-18/lastmod

changefreqalways/changefreq

priorityddd/priority

/url

url

loc;/loc

lastmod2015-11-18/lastmod

changefreqalways/changefreq

priorityddd/priority

/url

说下上面sed脚本的思路:

(1).一开始就将list.txt文件读取到pattern space空间,并保存到hold space。

(2).每读取到url的时候就继续读取后面5行,正好读到/url。

(3).读完了/url后,把hold space中的内容追加回pattern space,并从priorityXXXXXpriority开始判断后面是否还有XXXXX,如果有就直接删除pattern space,否则就将追加回pattern space的list.txt内容删除,最后输出。

(4).这样的执行方式,只需读取一次test.xml和list.txt文件,效率很高。

sed命令,搜索某个字符串,结果有多个匹配行,在第一个匹配行的前面添加一行内容

file:

aaaa

bbbb

cccc

bbbb

dddd

命令:

row=`sed "/bbbb/=" file | sed -n "1"p`

sed "${row}i\fulinux" file

Linux中如何利用sed进行全匹配替换?

sed 's/\old\/new/g' file

这个是匹配单词一样的东西

意思就是限制它的宽度 去掉左右两边之一就相当于放宽那边不限制

评论列表

访客
访客
2022-09-28

.xml的内容如下:复制内容到剪贴板代码:?xml version="1.0" encoding="UTF-8" standalone="no"?urlloc;/loclastmod2016-10-31/lastm

访客
访客
2022-09-28

是否存在于list文件中。如果存在,则删除这个url/url段落。假设你的test.xml文件的格式比较标准,每个url.../url段落内部都有4行,且其中一行是priority.../priority,必须符合这两个条件,否则要按需改代码:那么,新建一个a.sed文件,内容如下:

访客
访客
2022-09-27

3).读完了/url后,把hold space中的内容追加回pattern space,并从priorityXXXXXpriority开始判断后面是否还有XXXXX,如果有就直接删除pattern space,否则就将追加回pattern space的l

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。