perl中的正则表达式,匹配换行符和下一行的第一个单词

时间:2016-01-25 00:17:16

标签: regex perl

我有一个看起来像

的文件
title="title1"  
artist="artist1"  
title="title2"  
artist="artis2"  
title="title3"  
artist="artist3"

等等

这个命令
perl -pe 's/title="(.*?)"\n//ig' list.txt

不能像我一样希望工作。如果我单独这样做,我只会得到艺术家的线条,但是如果我这样做的话

perl -pe 's/title="(.*?)"\nartist//ig' list.txt

根本不匹配。
我已尝试使用和不使用/ g并尝试添加a / m 我已经看过nano中的文件,而且我看不到最后一个"在每一行和#34;艺术家"在下一个。

任何人都知道我做错了什么? (我使用perl而不是sed,因为生成此列表的正则表达式使用负向前瞻)。

我的目标是能够使用如下所示的线 perl -pe 's/title="(.*?)"\nartist="(.*?)"(?:\n|$)/\2 - \1/ig' list.txt

这将输出类似

的内容
artist1 - title1  
artist2 - title2  
artist3 - title3

4 个答案:

答案 0 :(得分:3)

您的替换

s/title="(.*?)"\n//ig

正在替换任何看起来像title="xxx"的行。它正在删除这些行。

目前还不清楚你想要什么,但如果你要求删除title=和引号那么你应该使用

perl -pe 's/title="(.*?)"/$1/i' myfile

/g修饰符是多余的,除非您希望文件中的一行中有多个标题


更新

如果你想与艺术家配对标题,那么你真的需要一个脚本文件。这应该做你需要的。数据直接来自您的问题

use strict;
use warnings 'all';
use feature 'say';

my $title;

while ( <DATA> ) {

    if ( /title="([^"]*)"/ ) {
        $title = $1;
    }
    elsif ( /artist="([^"]*)"/ ) {
        say "$1 - $title";
    }
}


__DATA__
title="title1"
artist="artist1"
title="title2"
artist="artis2"
title="title3"
artist="artist3"

输出

artist1 - title1
artis2 - title2
artist3 - title3

答案 1 :(得分:1)

你从未提及过你要做的事情。如果你想提取标题和艺术家,你会想要这样的东西:

our $s = q|
title="title1"
artist="artist1"
title="title2"
artist="artis2"
title="title3"
artist="artist3"
|;

my @matches = $s =~ /^title="(.*?)".*?^artist="(.*?)"/smg;

print join(';', @matches);

打印

title1;artist1;title2;artis2;title3;artist3

答案 2 :(得分:1)

对于"slurp"方法,您可以使用此正则表达式:

(^title="([^"]+)")\s*\R(^artist="([^"]+)")\s*(?:\R|\z)

Demo

然后给出你的例子:

$ echo "$art" 
title="title1"  
artist="artist1"  
title="title2"  
artist="artis2"  
title="title3"  
artist="artist3"

Just&#34; slurp&#34;包含-0777并打印$2$4的文件:

$ echo "$art" | perl -0777 -lne 'while (/(^title="([^"]+)")\s*\R(^artist="([^"]+)")\s*(?:\R|\z)/gm) { print "$4 - $2\n"}'
artist1 - title1
artis2 - title2
artist3 - title3

答案 3 :(得分:1)

如果您的文件与您描述的完全一样,则可以使用此命令一次读取两行。通过这种方式,您可以避免使用slurp模式:

perl -pe '$_.=<>;s/.*?"(.*?)".*?"(.*?)"/$2 - $1/s' file

如果您需要更明确的内容,可以使用:

perl -pe 'if (/^title="/){$_.=<>;s/^.*?"(.*?)"\h*\Rartist="(.*?)"\h*/$2 - $1/}' file