我有一个这样的列表来捕获 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
在下一行,则只显示该行 + 下两行。必须忽略其他行
所以结果应该是:
./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 的第二条公共(public)线路
最佳答案
通过打印接下来要发生的事情(很难做到,因为您还没有看到它!)而不是打印之前发生的事情(容易做到 -只需保存并打印即可):
$ 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';
每当您发现自己试图根据当前行之后的内容来弄清楚如何处理当前行时,请花时间重新考虑它,以便在处理 future 行时做某事(所以 IT 就是这样) “当前”行)基于它之前的内容。在软件和生活中 - 预见 future 比记住过去要难得多!
关于awk - 如果下一行匹配,则用 awk 打印行 + 下两行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41154136/