繁体   English   中英

Bash:如何对某些行但在其之间排除某些行?

[英]Bash: how to certain lines but exclude certain lines in between?

我有一个看起来像这样的文件:

a: 0
a: 0
a: 0
a: 1
b: 1
c: 1
d: 1
e: 1
f: 1
a: 2
b: 2
c: 2
d: 2
e: 2
f: 2
a: 3
b: 3
c: 3
d: 3
e: 3
f: 3
c: 4
c: 4
c: 4

我想捕获并输出所有形式为<a line><anything other than an a or c line><c line>形式的ac行,因此输出如下所示:

a: 1
c: 1

a: 2
c: 2

a: 3
c: 3

请注意,开头的a: 0行和结尾的c: 4行都没有被捕获,因为它们没有遵循我提到的模式。 还要注意, b之间行ac线被移除。

我一直在尝试使用Bash的pcregrep进行环视,但是还没有找到解决方案。 有任何想法吗?

谢谢!

使用awk

尝试:

$ awk -F: '$1=="a"{aline=$0} $1=="c"{if(aline)print aline ORS $0 ORS; aline=""}' file
a: 1
c: 1

a: 2
c: 2

a: 3
c: 3

这个怎么运作

默认情况下,awk一次读取一行。

  • -F:

    这告诉awk使用:作为字段分隔符。

  • $1=="a"{aline=$0}

    每次观察到a线时,将该行保存在变量aline

  • $1=="c"{if(aline)print aline ORS $0 ORS; aline=""}

    每次观察到c线时,请检查是否有非空aline 如果是这样,打印aline ,以及电流线,由换行符分隔。 另外,将aline设置回空字符串。

多行版本

对于那些喜欢他们的命令的人来说,它分几行:

awk -F: '
    $1=="a"{
        aline=$0
    }

   $1=="c"{
        if(aline)
            print aline ORS $0 ORS
        aline=""
    }' file

使用sed

$ sed -n '/^a/h; /^c/{x;/^a/{p;x;s/$/\n/;p};h}' file
a: 1
c: 1

a: 2
c: 2

a: 3
c: 3

这个怎么运作

  • -n

    这告诉sed除非我们明确要求,否则不要打印任何内容。

  • /^a/h

    任何时候,我们有一个开头的行a ,我们把它保存到保留空间。

  • /^c/{ x; /^a/{ p; x; s/$/\\n/; p}; h}

    每当我们有以c开头的行时,我们:

    • 我们将( x )模式空间与保留空间交换。

    • 如果新模式空间以a开头,则我们打印( p ),然后再次交换( x ),在新模式空间的末尾添加新行( s/$/\\n/ )并打印( p )它。

    • 最后,我们将当前模式空间(以c开头)保存到保持空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM