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_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/

相关文章:

regex - 这样匹配对吗?

regex - sed 正则表达式提取字段并构建新的

r - 在Windows机器上使用fread中的unix命令预处理文件

linux - 使用awk从多个条目中保留一个具有mex值的条目

linux - 如何操作文本行并为奇数和偶数创建两个单独的文件

regex - 如何在 bash 中使用 sed 按节获取 ini 文件的一部分

linux - 使用awk混合两个文件

linux - 如何使用 substr 比较替换字段

linux - awk - 提取唯一出现的字段 1,将字段 2 的多个实例附加到输出中的同一行

sed - 删除多行注释