我的记录格式是
"Bum Reviews" (2008) {The Dark Knight Rises (#5.9)} 2012
我需要在{
和(
我最终做了
cat file | awk -F"{" '{print $2}' | awk -F"(" '{print $1}'
我想知道使用perl
/ awk
正则表达式的最佳方法!
答案 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"