首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在perl中,匹配换行符和下一行的第一个单词。

在perl中,匹配换行符和下一行的第一个单词。
EN

Stack Overflow用户
提问于 2016-01-25 00:17:16
回答 4查看 2.9K关注 0票数 3

我有个文件看起来像

代码语言:javascript
复制
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

输出的结果如下

代码语言:javascript
复制
artist1 - title1  
artist2 - title2  
artist3 - title3
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-01-25 01:14:28

对于“咕噜”方法,可以使用以下正则表达式:

代码语言:javascript
复制
(^title="([^"]+)")\s*\R(^artist="([^"]+)")\s*(?:\R|\z)

演示

然后给出你的例子:

代码语言:javascript
复制
$ echo "$art" 
title="title1"  
artist="artist1"  
title="title2"  
artist="artis2"  
title="title3"  
artist="artist3"

只需使用-0777和打印$2$4的文件就可以了。

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

Stack Overflow用户

发布于 2016-01-25 00:37:01

你的替代

代码语言:javascript
复制
s/title="(.*?)"\n//ig

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

不清楚您想要什么,但是如果您的要求是删除title=和引号,那么您应该使用

代码语言:javascript
复制
perl -pe 's/title="(.*?)"/$1/i' myfile

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

更新

如果你想把标题和艺术家配对,那么你真的需要一个脚本文件。这应该能满足你的需要。这些数据直接取自你的问题。

代码语言:javascript
复制
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"

输出

代码语言:javascript
复制
artist1 - title1
artis2 - title2
artist3 - title3
票数 3
EN

Stack Overflow用户

发布于 2016-01-25 00:45:40

你从没提过你想做什么。如果你想提取标题和艺术家,你会想要这样的东西:

代码语言:javascript
复制
our $s = q|
title="title1"
artist="artist1"
title="title2"
artist="artis2"
title="title3"
artist="artist3"
|;

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

print join(';', @matches);

这个指纹

代码语言:javascript
复制
title1;artist1;title2;artis2;title3;artist3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34983282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档