仅输出[ABC]和[/ ABC]之间的字符

时间:2011-01-05 20:28:53

标签: perl scripting

$ 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]之间的随机字符。

我没有时间学习Perl:\

感谢您的期待!

4 个答案:

答案 0 :(得分:1)

我看到猫完全没用了。

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

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

答案 1 :(得分:0)

答案 2 :(得分: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

但是如果你的文件很大呢?只是将它们读入内存是行不通的。不过,你必须自己解决这个问题。

答案 3 :(得分:0)

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

 #!/usr/bin/perl

 use strict;
 use warnings;

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