![如何让 «grep -P "foo (br)"» 仅显示括号内的内容?我需要 perl 吗?](https://linux22.com/image/1272159/%E5%A6%82%E4%BD%95%E8%AE%A9%20%C2%ABgrep%20-P%20%22foo%20(br)%22%C2%BB%20%E4%BB%85%E6%98%BE%E7%A4%BA%E6%8B%AC%E5%8F%B7%E5%86%85%E7%9A%84%E5%86%85%E5%AE%B9%EF%BC%9F%E6%88%91%E9%9C%80%E8%A6%81%20perl%20%E5%90%97%EF%BC%9F.png)
我有一个大文件,我正尝试从中获取正则表达式的所有匹配项。
grep -P "foo (b.r)"
显示所有包含“foo br”的行,并且我只想显示括号内的内容。
专业问题:如果我设置了多个括号该怎么办?例如“foo (br) foo (.ar)”,我希望输出仅包含第一个括号和第二个括号中的内容,并用分隔符分隔。
我给这个代码贴上 Perl 标签,因为我确信我可以使用 «perl -e "..."» - 向 Perl 专家提问,如何编写这个代码?我已经很久没用过 Perl 了 :)
答案1
也许使用 grep 的 -o
-o, --only-matching
Show only the part of a matching line that matches PATTERN.
这将为您留下整个模式,然后用另一个 sed(?) 来删除/替换 (foo) 分隔符?
我怀疑它是否“高效”,但它能完成工作。
答案2
perl -ne '/foo \((.+?)\)/ and print "$1\n";'
这里\( \)
是文字括号并( )
创建一个组。
如果一行可以匹配多次,则应该工作:
perl -ne 'print "$1\n" for /foo \((.+?)\)/g;'
解密一行代码:
a and b
→if (a) {b}
b if a
→if (a) {b}
b for a
→for (a) {b}