2016-12-14 77 views
2

我有一个这样的名单赶上的Joomla版本打印线+接下来的两行使用awk如果下一行匹配

./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是两个下一行显示在下一行。否则线必须被忽略

所以结果应该是:

./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 "" 
} 

但是这会导致:

./somedir/bla/old/libraries/cms/version/version.php 
     public $RELEASE = '2.5'; 
./somedir/bla3/www/libraries/cms/version/version.php 
     public $RELEASE = '2.5'; 
./somedir/bla7/www/libraries/cms/version/version.php 
     public $RELEASE = '2.5'; 

我错过了dev_level的第二条公共线

回答

3

你打算在打印接下来会发生什么(难以做到,因为你还没有看到!)而不是打印之前发布的东西(容易做到 - 只是想要做到这一点)保存并打印):

$ awk '/public/{print p $0; p=""; next} {p=$0 ORS}' file 
./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'; 

你发现自己试图找出如何处理基于后,随之而来的当前行做任何时间,花时间重新考虑它在做什么,当你的条件'正在处理未来的产品线(因此IT是当前的产品线)。在软件和生活中 - 看到未来比记得过去要困难得多!

+0

此。两次。 (三次由于你知道什么) –

+0

@JamesBrown对不起,我不明白...过了漫长的一天... –

+0

三个字符填充。 –

0

grep

grep 'public $DEV' -B 2 yourfile.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. 
相关问题