我有个文件看起来像
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,并尝试添加一个/m --我已经用nano查看了该文件,并且在每一行的“final”和"artist“之间没有看到任何额外的字符。
有人知道我做错了什么吗?(我使用的是perl而不是sed,因为生成此列表的regex使用的是负面的展望)。
我的目标是能够像下面这样使用一条线
perl -pe 's/title="(.*?)"\nartist="(.*?)"(?:\n|$)/\2 - \1/ig' list.txt
输出的结果如下
artist1 - title1
artist2 - title2
artist3 - title3发布于 2016-01-25 01:14:28
对于“咕噜”方法,可以使用以下正则表达式:
(^title="([^"]+)")\s*\R(^artist="([^"]+)")\s*(?:\R|\z)然后给出你的例子:
$ echo "$art"
title="title1"
artist="artist1"
title="title2"
artist="artis2"
title="title3"
artist="artist3"只需使用-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发布于 2016-01-25 00:37:01
你的替代
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发布于 2016-01-25 00:45:40
你从没提过你想做什么。如果你想提取标题和艺术家,你会想要这样的东西:
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;artist3https://stackoverflow.com/questions/34983282
复制相似问题