Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用perl one liner使用正则表达式delimeter获取第一个和最后一个字段_Regex_Perl - Fatal编程技术网

Regex 使用perl one liner使用正则表达式delimeter获取第一个和最后一个字段

Regex 使用perl one liner使用正则表达式delimeter获取第一个和最后一个字段,regex,perl,Regex,Perl,我需要解析一个文件,并使用正则表达式作为分隔符的一部分从中获取某些字段。我想我可以用perl来做这个(?)。问题是我不能让它正常工作。这是一个单行线,我认为它可以让我打印由一个或多个空格分隔的字段(在本例中为一个或多个空格): 输出文件来自makefile 在这里,我想打印出第一个令牌和最后一个令牌。在我的例子中,使用了哪个编译器,编译了哪个文件。也许有更好的方法可以做到这一点,但现在我想知道为什么我的perl one行程序不起作用 无论如何,正则表达式“/+/”似乎不起作用。我得到了一些意想不

我需要解析一个文件,并使用正则表达式作为分隔符的一部分从中获取某些字段。我想我可以用perl来做这个(?)。问题是我不能让它正常工作。这是一个单行线,我认为它可以让我打印由一个或多个空格分隔的字段(在本例中为一个或多个空格):

输出文件来自makefile

在这里,我想打印出第一个令牌和最后一个令牌。在我的例子中,使用了哪个编译器,编译了哪个文件。也许有更好的方法可以做到这一点,但现在我想知道为什么我的perl one行程序不起作用

无论如何,正则表达式“/+/”似乎不起作用。我得到了一些意想不到的结果。也许F实际上并不需要正则表达式?当我用包含一个空格的“/”替换F的参数时,仍然没有得到预期的输出

有人能帮忙吗?谢谢

这里有一些测试代码供您尝试。将其保存在文件中:

g++ -c  -g  -Wall -I/codedir/src/CanComm/include -I/home/codemonkey/workspace/thirdparty/Boost -Wno-deprecated SCMain.cpp
g++ -c -g  -Wall -I./object/include -I./wrapper/include -I./Properties/include -I./Messaging/include -I/codedir/src/Logging/sclog/include ./object/SCObject.cpp ./object/RandNumGenerator.cpp ./object/ScannerConstraints.cpp ./object/ThreadSync.cpp ./object/SCData.cpp ./object/AirScanData.cpp ./object/ClusterData.cpp ./object/WarmupData.cpp ./object/SCCommand.cpp ./object/ScanCommands.cpp ./object/RCCommands.cpp ./object/ReconData.cpp ./object/UICommTool.cpp ./object/UIMsg.cpp ./object/UI2SCConversion.cpp ./object/RCMsg.cpp ./object/RCMessageInfo.cpp ./object/Utils.cpp ./object/ZBackupTable.cpp ./object/ZBackupFactory.cpp
g++ -c -g  -Wall -I./Properties/include -I/codedir/src/Logging/sclog/include -I./object/include -I/home/codemonkey/workspace/thirdparty/Boost  ./Properties/PropertyMap.cpp

您的正则表达式模式应如下所示:

'/\s+/'

\s意味着匹配任何空白

您的正则表达式模式应如下所示:

'/\s+/'

\s表示根据
perldoc perlrun
匹配任何空格:

-F模式

如果-a也有效,则指定要拆分的图案。 该模式可能被“/”、“”或“”包围,否则它将被置于单引号中您不能在模式中使用文字空白。


我不得不承认:这是一个多么武断的限制啊

根据perldoc perlrun:

-F模式

如果-a也有效,则指定要拆分的图案。 该模式可能被“/”、“”或“”包围,否则它将被置于单引号中您不能在模式中使用文字空白。


我不得不承认:这是一个多么武断的限制啊

对于您的问题,您实际上不需要指定一个模式作为默认模式,即空间可能对您有足够的好处

perl -anle 'print "$F[0], $F[-1]"' build_outputfile

对于您的问题,实际上不需要指定一个模式作为默认模式,即空间可能对您有足够的好处

perl -anle 'print "$F[0], $F[-1]"' build_outputfile

感谢您的快速响应!但是为什么我使用的regexp不起作用呢?在这种情况下,我想在空格字符上拆分,而不是在空格字符上拆分?空格字符是一个空格\s将匹配与使用默认拆分相同的空格、换行符或制表符,这意味着跳过-F开关。感谢您的快速响应!但是为什么我使用的regexp不起作用呢?在这种情况下,我想在空格字符上拆分,而不是在空格字符上拆分?空格字符是一个空格\s将匹配空格、换行符或制表符,这与使用默认拆分相同,这意味着只需跳过-F开关。我可以显式地拆分每一行,而不是让perl自动执行:perl-ne'@f=split(+/);打印“$f[0],$f[-1]\n”'虽然没有使用-f参数那么紧凑,但它可以工作。有人对-F参数版本有答案吗?谢谢。
perl-lnwe'$,=“,”;print/^\S+|\S+$/g'
可能也能做到这一点,而且可能比完全拆分快(尽管我怀疑它在如此小的输入下是否会明显)。嗯,我想到了一种解决问题的方法。我可以显式地拆分每一行,而不是让perl自动执行:perl-ne'@f=split(+/);打印“$f[0],$f[-1]\n”'虽然没有使用-f参数那么紧凑,但它可以工作。有人对-F参数版本有答案吗?谢谢。
perl-lnwe'$,=“,”;print/^\S+|\S+$/g'
可能也能做到这一点,并且可能比完全拆分更快(尽管我怀疑它在如此小的输入下是否会明显)。确实,这是一个多么疯狂的限制!!现在我知道了,-F代表搞笑。我应该用我那笨重的方法。随着时间的推移,我很可能会忘记这一点。呵呵。。。。安,回答得真棒。谢谢“我终于不能再为这件事烦恼了。”牧师:不客气。(顺便说一句,你可以选择有用的答案,和/或选择它们作为正确答案…;-)+1。幸运的是,您可以通过将空格写为
\x20
来解决这个问题;所以,
-anF'/\x20+/'
。真是一个疯狂的限制!!现在我知道了,-F代表搞笑。我应该用我那笨重的方法。随着时间的推移,我很可能会忘记这一点。呵呵。。。。安,回答得真棒。谢谢“我终于不能再为这件事烦恼了。”牧师:不客气。(顺便说一句,你可以选择有用的答案,和/或选择它们作为正确答案…;-)+1。幸运的是,您可以通过将空格写为
\x20
来解决这个问题;所以,
-anF'/\x20+/'
。默认模式在这里是正确的。但是如果给定了
-n
,那么Perl将从
读取输入,这将从命令行上指定的任何文件读取——如果没有指定的文件,它只从stdin读取,因此没有必要使用
我将给您+1来查看默认拆分是否正确,但是-1表示您需要通过stdin进行管道传输。您认为默认模式在这里是正确的。但是,如果给定了
-n
,那么Perl将从
读取输入,这将从命令行上指定的任何文件读取——如果没有stdin,它只从stdin读取,因此不必使用
,我将为您提供+1以查看默认拆分是否正确,而为您需要通过stdin而提供-1。