如何在两个不同的字符之间提取匹配的字符串?

时间:2014-04-20 19:49:36

标签: regex perl awk

我的记录格式是

"Bum Reviews" (2008) {The Dark Knight Rises (#5.9)} 2012

我需要在{(

之间提取移动名称

我最终做了

cat file | awk -F"{" '{print $2}' | awk -F"(" '{print $1}'

我想知道使用perl / awk正则表达式的最佳方法!

3 个答案:

答案 0 :(得分:1)

这应该做:

awk -F"[{(]" '{print $3}' file
The Dark Knight Rises

为了更准确,请使用:

awk -F"[{}]" '{split($2,a," [(]");print a[1]}' file
The Dark Knight Rises

或者

awk -F"[{}]" '{sub(/ \(.*/,"",$2);print $2}' file
The Dark Knight Rises

后两者将仅获取{}之间的数据,然后移除(..)

答案 1 :(得分:1)

您只需将grep-o-P选项一起使用(使用后置断言)。

grep -oP '(?<={)[^(]+' file

实施例

$ echo '"Bum Reviews" (2008) {The Dark Knight Rises (#5.9)} 2012' | grep -oP '(?<={)[^(]+'
The Dark Knight Rises

perl如果您坚持:

echo '"Bum Reviews" (2008) {The Dark Knight Rises (#5.9)} 2012' | perl -lne '{ print /(?<={)[^(]+/g}'

答案 2 :(得分:-1)

正则表达式

/ \{ \s* ( [^(){}\s] (?: [^(){}]* [^(){}\s] )? ) /x

将为您提取您的标题,以及删除任何前导或尾随空白区域。它还考虑了标题后括号内没有得分的情况。

use strict;
use warnings;

my $s = '"Bum Reviews" (2008) {The Dark Knight Rises (#5.9)} 2012';

my $title;
if ($s =~ / \{ \s* ( [^(){}\s] (?: [^(){}]* [^(){}\s] )? ) /x) {
  $title = $1;
  print qq{"$title"\n};
}

<强>输出

"The Dark Knight Rises"