【问题标题】:sed search a range and print first setsed 搜索范围并打印第一组
【发布时间】:2017-01-25 22:33:27
【问题描述】:

我有一个文件如下

myname
_       something
_       something
_       something
myname
_       something
_       something
myname
_       something
and it follows and no standard other than myname word.

现在我想打印从 myname 到 myname 的第一组搜索,如下所示。

myname
_       something
_       something
_

我尝试使用以下方法,但它不起作用。

sed -n -e '/myname/,/myname/ p' file

它打印所有的集合。

也试过了,但没用。

sed -n '/myname/,$ p;/myname/q'

【问题讨论】:

    标签: linux shell sed awk


    【解决方案1】:

    这是awk的另一种方式:

    awk '/myname/{++c}c<2' file
    

    $ cat file
    myname
    _       something
    _       something
    _       something
    myname
    _       something
    _       something
    myname
    _       something
    

    $ awk '/myname/{++c}c<2' file
    myname
    _       something
    _       something
    _       something
    

    如果你的文件太大,那么:

    awk '/myname/{++c}c==2{exit}1' file
    

    【讨论】:

    • @SriharshaKalluru 不客气。请确保您阅读此answer。它包含许多珍贵的宝石!
    【解决方案2】:
    awk  '/myname/{if(b) exit; else b=1}1' filename
    
    
    
    $ cat temp.txt
    myname
    _       something
    _       something
    _       something
    myname
    _       something
    _       something
    myname
    _       something
    
    $ awk  '/myname/{if(b) exit; else b=1}1' temp.txt
    myname
    _       something
    _       something
    _       something
    

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

      sed '/myname/{:a;n;//Q;$!ba}' file
      

      查找模式myname,然后设置一个循环,打印当前行,如果新的当前行包含上述模式或循环,则退出(但不打印)。

      另一种选择,使用类似 grep 的选项 -n

      sed -n '/myname/{:a;p;n;//q;ba}' file
      

      【讨论】:

      • @potong:这个解决方案看起来是一个不错的 sed 选项,你能详细说明这个命令是如何工作的吗?以及//Q 之间的含义是什么。
      • @protong:据我所知 //Q 是一个带有“退出”标志的空搜索表达式。是否就像当您传递一个空的搜索表达式时它使用最后使用的搜索表达式(在本例中是 myname)?当我使用这个 sed '/myname/{:a;n;/myname/Q;$!ba}' 时,它看起来也以同样的方式工作。
      • @user3369871 correct
      【解决方案4】:

      这是一个 Bash 解决方案。

      n=0
      while read line; do
          [[ $line == myname ]] && ((n++))
          [ $n -gt 1 ] && break
          echo $line
      done < file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        • 2013-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-16
        • 1970-01-01
        相关资源
        最近更新 更多