在 perl 单行代码中打印匹配的子组

在 perl 单行代码中打印匹配的子组

我有正则表达式[1]

(/foo/bar/(GW|GREV)[^/]*).*

我能够让它与 GNU sed 一起工作

sed -n 's/\(\/foo\/bar\/\(GW\|GREV\)[^\/]*\).*/\1/p'

但那是现代的 GNU sed,而我在 Solaris 10 上使用古老的 sed。也许可以移植它,但这超出了我的能力。不过,我确实有可用的 perl 5.8,所以我的问题是:如何在 perl 单行中打印匹配的子组?


[1] 要点是我想要匹配所有符合 /foo/bar/GWxxx、/foo/bar/GREVxxx 格式的目录并打印该根目录。因此对于以下字符串,我总是将其/foo/bar/GREV123作为捕获组:

/foo/bar/GREV123
/foo/bar/GREV123/
/foo/bar/GREV123/etc

答案1

perl -pe 's{^(/foo/bar/(GW|GREV)[^/]*).*?$}{$1}o'

解析版本:

LINE: while (defined($_ = <ARGV>)) {
    s[^(/foo/bar/(GW|GREV)[^/]*).*?$][$1]o;
}
continue {
   die "-p destination: $!\n" unless print $_;
}

PS 您可以添加代码来禁止打印重复的条目

相关内容