2016-12-14 67 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.