我有一个这样的列表来捕获 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';
Run Code Online (Sandbox Code Playgroud)
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';
Run Code Online (Sandbox Code Playgroud)
我尝试过使用 awk 和这个 awk 脚本
BEGIN{ RS=""; FS="\n" }
/public/ {
for (i=1; i<=NF; i++) {
if ( ! (($i ~ /./) && ($(i+1) !~ /public/) && ($(i+2) !~ /public/) ) ) {
print $i
}
}
print ""
}
Run Code Online (Sandbox Code Playgroud)
但这会导致:
./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';
Run Code Online (Sandbox Code Playgroud)
我缺少 dev_level 的第二条公共线路
通过考虑打印接下来的内容(很难做到,因为你还没有看到它!),而不是打印之前的内容(很容易做到 - 只需保存它),您会使这变得比必须的更难并打印出来):
$ 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';
Run Code Online (Sandbox Code Playgroud)
每当您发现自己试图根据当前行之后的内容来弄清楚如何处理当前行时,请花时间重新思考在处理未来行时要做什么(因此 IT 就是“当前行”) " 行)基于之前的内容。在软件和生活中 - 预见未来比记住过去要困难得多!