使用perl one-liner攻击带有正则表达式分隔符的第一个和最后一个字段

时间:2012-10-24 13:42:41

标签: regex perl

我需要使用正则表达式作为分隔符的一部分来解析文件并从中获取某些字段。我以为我可以使用perl来做这个(?)。问题是我无法让它正常工作。这是一个衬垫,我认为可以让我打印由一个或多个空格分隔的字段(在这种情况下是一个或多个空格):

bash_prompt> perl -anF'/ +/' -e 'print "$F[0], $F[-1]\n"' build_outputfile

输出文件来自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

3 个答案:

答案 0 :(得分:3)

根据perldoc perlrun

  

-Fpattern

     如果-a也有效,

指定要拆分的模式。   模式可以用“//”,“”或“''包围,否则它将被放在单引号中。 您无法在模式中使用文字空格。

我必须承认:这是一个完全武断的限制!

答案 1 :(得分:2)

对于你的问题,你实际上并不需要指定一个模式作为默认值,空间可能足够好。

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

答案 2 :(得分:0)

你的正则表达式应该是这样的:

'/\s+/'

\ s 表示匹配任何空格