解析sed -n '/^AAAA/{:a;N;${s/\(.*BBBB[^\n]*\).*/\1/p};Ta}'

个人理解,求真相。

先来看看这个命令吧

sed -n ‘/^AAAA/{:a;N;${s/\(.*BBBB[^\n]*\).*/\1/p};Ta}‘ a.txt

他实现的结果是 查找一个文件中 AAAA到BBBB字符串能匹配到的最后一行的所有内容

sed -n ‘/^2012/{:a;N;${s/\(.*2014[^\n]*\).*/\1/p};Ta}‘ a.txt

a.txt 如下:

2012 aaaa

2012 bbbb

2013 cccc

2013 cccc

2014 1111

2014 2222

2014 3333

2015 5555

2015 xxxx

分解如下:

sed -n ‘/^2012/{

:a

N

${

s/\(.*2014[^\n]*\).*/

\1/p

}

Ta

}

1.首先第一个^2012是要匹配到以2012开头的行(如果字符串有在行中间的情况下^是可以去掉的)我个人觉得去掉效果会更好,已测 第一步的作用是让我们后面的命令知道我们已经从哪里开始来执行,当我们第一步找到第一个2012的时候,我后面就可以执行了

2.第一步我们显然匹配到了第一行:2012 aaaa 匹配到之后,我们先跳过:a,最后再说

匹配之后,我们执行了N命令。现在来看N命令的意思

N:追加下一个输入行到读取行的末尾 兵加入一个\n 存入缓冲区(pattern apace)

那么现在我们的缓冲区的内容是 2012 aaaa\n2012 bbbb

然后接着往后匹配匹配的是 ${s/\(.*2014[^\n]*\).*/\1/p}

现在来解析这个 首先${}是匹配最后一行的内容,也就是说如果缓冲区里最后一行的内容是

${s/\(.*2014[^\n]*\).*/\1/p}  那么这个命令的状态是yes的 否则是no 那么这个状态要配合后面的Ta来使用了 $最后一行是不是后面匹配的内容

现在再来说:a   Ta  这是一个组合 意思是:

先建立一个标签a 如果Ta前面的命令状态是no,也是没匹配到,就返回到标签a处,如果是yes 这个命令就结束 打印出缓冲区

继续执行后面的命令,这样就达到了循环的目的。

现在我们来看,刚刚我们的缓冲区是2012 aaaa\n2012 bbbb后面的匹配当然就是匹配我们的缓冲区的最后一行数据,现在最后一行为2012 bbbb 的 ${s/\(.*2014[^\n]*\).*/\1/p}  显然不是 那么他的状态就是no

我们就又跳到了a 接着执行N,现在我们的缓冲区是2012 aaaa\n2012 bbbb 执行N后先加上\n然后加上了下一行 2012 aaaa\n2012 bbbb\n\2013 cccc

现在我们的缓冲区就是 2012 aaaa\n2012 bbbb\n\2013 cccc 然后执行后面 这一行是否匹配到了 ${s/\(.*2014[^\n]*\).*/\1/p} 显然没有 一直往下

我们最后到了2014 1111 行 在这一行我们的缓冲区是2012 aaaa\n2012 bbbb\n\2013

cccc\n....2014 1111

这时我们缓冲区的最后一行是2014 1111

他的前面是任意多的任意字符 ——符合

后面是任意多的非换行符 —— 符合

命令状态 yes

Ta循环结束 输出缓冲区内容 清空缓冲区

2012 aaaa

2012 bbbb

2013 cccc

2013 cccc

2014 1111

虽然循环结束但是匹配没有结束,seb依然要对下面的内容进行遍历

现在我们到了2014 2222 先执行了N 现在缓冲区为2014 2222\n2014 3333

然后匹配 ${s/\(.*2014[^\n]*\).*/\1/p}  符合 状态yes 循环结束

输出缓冲区2014 2222\n2014 3333

为什么我们匹配到2013 cccc的时候 就跳过了2014 1111 直接到了2014 2222

因为我们的2014 1111 已经被N所改变了结构 成为了上一行的内容 行号也跟着改变 这是一点比较抽象

然后我们接着匹配到了2015 5555 执行N 缓冲区为2015 5555\n2015 xxxx

匹配${s/\(.*2014[^\n]*\).*/\1/p} 不成立 状态no 执行Ta循环 到a 继续执行N... 后面已经没有2014了 所以 命令状态一直为no 知道结束都不会输出缓冲区了

其实这个命令的^AAAA可以用AAAA来代替 更加好用 已测

大致就是这么个意思 不知道我的理解是否正确,如有错误,求指正。真心佩服原创的人。

解析sed -n '/^AAAA/{:a;N;${s/\(.*BBBB[^\n]*\).*/\1/p};Ta}'

时间: 2024-07-29 05:00:28

解析sed -n '/^AAAA/{:a;N;${s/\(.*BBBB[^\n]*\).*/\1/p};Ta}'的相关文章

SED总结

一.Sed简介 Sed:Stream Editor  流式编辑器 又称行编辑器,每次只编辑一行.Sed工作是在“模式空间”中进行的,并不操作源文件.对源文件无危害. 二.Sed使用格式     Sed命令的常用格式如下: (1)Sed [options] ‘script’ input_file… (2)Sed [options] –f script_file input_file… (3)Sed [options] ‘ADDR1,ADDR2command’ input_file… 例如:#sed

文本处理三剑客之sed

文本处理三剑客之sed sed概述 sed使用示例 sed的高级应用 sed概述 sed, 作为文本三剑客之一,其定位就是一个编辑器, 而且sed是一个流式编辑器(stream editor),其主要功能是过滤和转换文本. sed - stream editor for filtering and transforming text 作为一个强大的文本处理功能,sed 自然能够配合正则表达式,另外,所谓流编辑器,sed 是逐行地读取文本,在文本行中应用指定的命令,且默认输出到stdout; se

Linux文本三剑客超详细教程---grep、sed、awk

awk.grep.sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理. 1.grep 1.1 什么是grep和egrep Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红).grep全称是Global

sed个人习惯用法总结

我这个是根据个人习惯做的笔记,一般常用的我就不记了,记一些爱忘记的!!! sed -[nerif] '行号,行号 action/str/str/action' file (/,@,#都是前面所说的地址定界符) sed '[email protected]@@' file sed 's///' file sed 's###' file 这三种方式都行 sed命令的语法格式: sed的命令格式: sed [option] 'sed command'filename sed的脚本格式:sed [opt

Sed&awk笔记之sed篇(转)

Sed是什么 <sed and awk>一书中(1.2 A Stream Editor)是这样解释的: Sed is a "non-interactive" stream-oriented editor. It is stream-oriented because, like many UNIXprograms, input flows through the program and is directed to standard output. Sed本质上是一个编辑器,

sed入门

一.在某行的前一行或后一行添加内容 具休操作如下: #匹配行前加 sed -i '/allow 361way.com/iallow www.361way.com' the.conf.file #匹配行前后 sed -i '/allow 361way.com/aallow www.361way.com' the.conf.file 而在书写的时候为便与区分,往往会在i和a前面加一个反加一个反斜扛 .代码就变成了: sed -i '/2222222222/a\3333333333' test.txt

Sed、Awk单行脚本快速参考

文本间隔: # 在每一行后面增加一空行 sed G awk '{printf("%s\n\n",$0)}' # 将原来的所有空行删除并在每一行后面增加一空行. # 这样在输出的文本中每一行后面将有且只有一空行. sed '/^$/d;G' awk '!/^$/{printf("%s\n\n",$0)}' # 在每一行后面增加两行空行 sed 'G;G' awk '{printf("%s\n\n\n",$0)}' # 将第一个脚本所产生的所有空行删

SED单行脚本快速参考(Unix 流编辑器)

------------------------------------------------------------------------- SED单行脚本快速参考(Unix 流编辑器) 2005年12月29日 英文标题:USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor) 原标题:HANDY ONE-LINERS FOR SED (Unix stream editor) 整理:Eric Pement - 电邮:pemente[at]no

Sed&amp;awk笔记之sed篇

http://blog.csdn.net/a81895898/article/details/8482387 Sed是什么 <sed and awk>一书中(1.2 A Stream Editor)是这样解释的: Sed is a "non-interactive" stream-oriented editor. It is stream-oriented because, like many UNIXprograms, input flows through the pr