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

Perl 仅输出介于[ABC]和[/ABC]之间的字符,perl,scripting,Perl,Scripting,因此“NEEDEDONELINER”只输出[ABC]和[/ABC]之间的字符 [ABC]可能会出现多次,并且周围可能有随机字符 我只需要[ABC]和[/ABC]之间的随机字符 我没有时间学习Perl:\ 谢谢你的反对 修复: 我认为猫完全没有用处 $ cat somefile.txt afsdfv asdf[ABC]dafga asdfasf yxcvyxv[/ABC] asdadf yv[ABC]sdfb sdfgadfg [/ABC]adf asdf $ cat somefile.txt |

因此“
NEEDEDONELINER
”只输出
[ABC]
[/ABC]
之间的字符

[ABC]
可能会出现多次,并且周围可能有随机字符

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

我没有时间学习Perl:\

谢谢你的反对

修复:

我认为猫完全没有用处

$ 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
$
perl-le'$/=”;$\u=;打印$2while/\[(ABC\])(.*?\[\/\1/gs'是的。
然后呢

但这并没有考虑到多行字符串——您的澄清已经说明了这一点

m!\Q[ABC]\E\K(.*?)(?=\Q[/ABC]\E)!g;
使用严格;
使用警告;
使用5.010;

打开我的$fh,“几天前,Fedora邮件列表上有人问了一个非常类似的问题。下面是我在那里给出的答案(需要一些相当明显的编辑):

!/usr/bin/perl
严格使用;
使用警告;
而(){
if(m|\[XYZ]|…m|\[/XYZ]|){
下一个如果m\[/?XYZ];
印刷品;
}
}

任何空格都只会使实现“一行”的目标变得更加困难-如果命令也是60个字符,那么PS1提示符和文件名在许多情况下已经超过终端窗口80中的一行。
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
 #!/usr/bin/perl

 use strict;
 use warnings;

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