我有一个看起来像
的文件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
答案 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)
然后给出你的例子:
$ 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