Regex 在Perl中逐行从文件中提取以特定字符开头的单词

Regex 在Perl中逐行从文件中提取以特定字符开头的单词,regex,perl,file,Regex,Perl,File,首先,我要说我是Perl和regex的新手,我从来都不是最好的朋友 我的问题是,我有一个充满行的文本文件。每行包含许多“单词”。这些单词可以包含字母、数字、、=,等等。除了空格外,几乎可以包含所有内容。每个单词之间用空格隔开 每行中都有一个单词以三个唯一的字符“mc=”开头。所以这个词可以是“mc=abcde123”,“mc=12345hij”,“mc=blah”。。。你明白我的意思。我想从每一行中提取这个单词,并将它们插入到一个新的文本文件中 #!/usr/bin/perl use warn

首先,我要说我是Perl和regex的新手,我从来都不是最好的朋友

我的问题是,我有一个充满行的文本文件。每行包含许多“单词”。这些单词可以包含字母、数字、、=,等等。除了空格外,几乎可以包含所有内容。每个单词之间用空格隔开

每行中都有一个单词以三个唯一的字符“mc=”开头。所以这个词可以是“mc=abcde123”,“mc=12345hij”,“mc=blah”。。。你明白我的意思。我想从每一行中提取这个单词,并将它们插入到一个新的文本文件中

#!/usr/bin/perl

use warnings;

my $input = 'input.txt';
my $output = 'output.txt';

open (FILE, "<", $input) or die "Can not open $input $!";
open my $out, '>' $output or die "Can not open $output $!";

while (<FILE>){
    /(\s+mc=\/*S)/g;
    print $out $_;
}
#/usr/bin/perl
使用警告;
my$input='input.txt';
my$output='output.txt';
打开(文件“
!/usr/bin/perl
使用警告;
my$input='input.txt';
my$output='output.txt';

打开(文件,“唯一需要匹配的是一个以
mc=
开头的非空白字符串,它前面有字符串开头或空白。因此,您需要的正则表达式是

/(?<!\S)(mc=\S*)/g
/(?
使用否定查找断言
(?是一种断言关键字前没有非空格的方法。我们不能使用
(?output.txt)
一个单行程序,它将在每一个单词的新行上打印匹配的字符串,并使用shell重定向(*nix shell)将单词打印到一个新文件中。这将替换整个脚本

您还可以使用以下方法修补自己的代码:

print $out $_ for /(?<!\S)(mc=\S*)/g;
为/(?

但是,我觉得将文件名硬编码是没有必要的,尤其是当perl在这种情况下有这么好的预定义功能时。

如果/\b(mc=\S*)/;
您可能已经有了这一点(应该会出现语法错误),但是您还缺少了一个逗号……‘打开我的$out’>,$output或die“无法打开$output$!”@mpapec将匹配
fake mc=123
@mpapec我假设他想匹配以
mc=
开头的单词?@mpapec他说每行包含
一个以三个唯一字符开头的单词,'mc='
,并且这个单词包含除空格以外的任何内容。这也将匹配
abcmc=
,事实上任何字符串其中包含
mc=
,因为
\s*
也与空字符串匹配。@mpapec根据您对该问题所做的编辑量,您最好编写自己的答案。:)谢谢各位,你们对解决方案的解释非常出色!@mpapec我一直认为
/x
修饰符让事情看起来很奇怪。非常感谢你们。你们不仅回答了我的问题,而且还以一种对我疲惫和困惑的大脑有意义的方式解释了它。你们愿意每一次机会写一本关于这个主题的教科书吗?哟不客气。当然,这本书的主题太有限了,但我很高兴它对我有所帮助。关于编写正则表达式已经有了一个新的方法。
perl -nle 'print for /(?<!\S)(mc=\S*)/g' input.txt > output.txt
print $out $_ for /(?<!\S)(mc=\S*)/g;