打印行+;如果下一行匹配,则下两行使用awk

打印行+;如果下一行匹配,则下两行使用awk,awk,Awk,我有一张这样的清单来捕捉joomla的版本 ./somedir/bla/old/libraries/cms/version/version.php public $RELEASE = '2.5'; public $DEV_LEVEL = '24'; ./somedir/bla3/www/libraries/cms/version/version.php public $RELEASE = '2.5'; public $DEV_LEV

我有一张这样的清单来捕捉joomla的版本

./somedir/bla/old/libraries/cms/version/version.php
        public $RELEASE = '2.5';
        public $DEV_LEVEL = '24';
./somedir/bla3/www/libraries/cms/version/version.php
        public $RELEASE = '2.5';
        public $DEV_LEVEL = '9';
./somedir/bla4/www/libraries/cms/version/version.php
./somedir/bla5/www/w/scripts/version.php
./somedir/bla6/www/libraries/cms/version/version.php
./somedir/bla7/www/libraries/cms/version/version.php
        public $RELEASE = '2.5';
        public $DEV_LEVEL = '9';
我想要的是,如果
public
位于下一行,则只显示该行+下两行。Else行必须忽略

因此,结果应该是:

./somedir/bla/old/libraries/cms/version/version.php
        public $RELEASE = '2.5';
        public $DEV_LEVEL = '24';
./somedir/bla3/www/libraries/cms/version/version.php
        public $RELEASE = '2.5';
        public $DEV_LEVEL = '9';
./somedir/bla7/www/libraries/cms/version/version.php
        public $RELEASE = '2.5';
        public $DEV_LEVEL = '9';
我尝试过使用Awk和这个Awk脚本

BEGIN{ RS=""; FS="\n" }
 /public/ {
    for (i=1; i<=NF; i++) {
        if ( ! (($i ~ /./) && ($(i+1) !~ /public/) && ($(i+2) !~ /public/) ) ) {
            print $i
        }
    }
    print ""
}

我错过了开发级别的第二条公开线路

您正在通过打印下一步的内容(因为您还没有看到它,所以很难做到!)而不是打印之前的内容(很容易做到-只需保存并打印即可),使这一点变得更加困难:


任何时候,当你发现自己试图根据当前行之后的内容来决定如何处理当前行时,请花时间重新思考,在处理未来行时,根据之前的内容来做一些事情(因此它就是“当前”行)。在软件和生活中,看到未来比回忆过去要困难得多

尝试使用
grep

 -B NUM, --before-context=NUM
     Print NUM lines of leading context before matching lines.  
     Places a line containing a group separator (--) between contiguous groups of matches.
grep'public$DEV'-b2yourfile.txt

man grep

 -B NUM, --before-context=NUM
     Print NUM lines of leading context before matching lines.  
     Places a line containing a group separator (--) between contiguous groups of matches.

这两次。(三次是因为你知道什么)三次是字符填充。非常有用的评论。这使我在我的模式之前展示了主导上下文。谢谢
 -B NUM, --before-context=NUM
     Print NUM lines of leading context before matching lines.  
     Places a line containing a group separator (--) between contiguous groups of matches.