2011-01-05 64 views
0
$ cat somefile.txt 
afsdfv 
asdf[ABC]dafga 
asdfasf 
yxcvyxv[/ABC] 
asdadf 
yv[ABC]sdfb 
sdfgadfg 
[/ABC]adf 
asdf 
$ cat somefile.txt | NEEDEDONELINER > output.txt 
dafga 
asdfasf 
yxcvyxv 
sdfb 
sdfgadfg 
$ 

因此, “NEEDEDONELINER” 仅输出[ABC][/ABC]之间的字符。仅输出[ABC]和[/ ABC]之间的字符

[ABC]可能会发生多次,并且可能会出现随机字符。

我只需要[ABC][/ABC]之间的随机字符。

我没有时间学习Perl:\

谢谢你的期待!

回答

0

是你做的。 perlretut然后perlre

m!\Q[ABC]\E\K(.*?)(?=\Q[/ABC]\E)!g; 

但是这并没有考虑多行字符串 - 你的澄清有。

use strict; 
use warnings; 
use 5.010; 

open my $fh, '<', $ARGV[0]; 
my $full_file = do { local $/; <$fh> }; 

say join "\n", $full_file =~ m! 
           \Q[ABC]\E \K 
           (.*?) 
          (?=\Q[/ABC]\E) 
          !gxs; 

或者作为一个班轮:

perl -E 'say join qq!\n!, do { local $/; <> } =~ m!\Q[ABC]\E\K(.*?)(?=\Q[/ABC]\E)!gs' somefile.txt > output.txt 

但是,如果你的文件是巨大的?只是将它们读入内存不会。不过,你必须自己找出一个。

+0

我的天啊。这实际上起作用。我很惊讶。 – LanceBaynes 2011-01-05 21:06:20

1

我看到一个完全无用的使用猫。

perl -le '$/="";$_=<>;print$2while/\[(ABC\])(.*?)\[\/\1/gs' <file.txt 

(哦,这一些不错的高尔夫;-)

+0

但是你的代码中不会有空格吗? – 2011-01-05 21:52:04

+0

任何空间只会让它难以达到成为“单行”的目标 - 考虑到命令也是60个字符,在许多情况下,PS1提示和文件名在80的终端窗口中已经超过一行。 – user562374 2011-01-06 03:42:05

0

几天前在Fedora邮件列表上提出了一个非常类似的问题。这里是我在那里给出的答案(这需要一些相当明显的编辑):

#!/usr/bin/perl 

use strict; 
use warnings; 

while (<>) { 
    if (m|\[XYZ]| .. m|\[/XYZ]|) { 
    next if m|\[/?XYZ]|; 
    print; 
    } 
} 
相关问题