1

デリミタの一部として正規表現を使用して、ファイルを解析し、そこから特定のフィールドを取得する必要があります。これを行うにはperlを使用できると思いました(?)。問題は、それを適切に機能させることができないことです。これは、もう1つの空白(この場合は1つ以上のスペース)で区切られたフィールドを印刷できると私が考えた1つのライナーです。

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

出力ファイルはメイクファイルからのものです。

ここでは、最初のトークンと最後のトークンを出力したいと思います。したがって、私の場合、どのコンパイラが使用され、どのファイルがコンパイルされましたか。もっと良い方法があるかもしれませんが、私の perl ワンライナーが機能しない理由が気になります。

とにかく、正規表現 '/ +/ は機能していないようです。予期しない出力が得られます。おそらく、F は実際には正規表現を必要としないのでしょうか? F の引数を 1 つのスペースを含む '/ /' に置き換えても、まだ期待どおりの出力が得られません。

誰でも助けることができますか?ありがとう。

試してみるためのテストコードを次に示します。ファイルに保存します。

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
4

3 に答える 3

3

によるとperldoc perlrun

-Fパターン

-a も有効な場合に分割するパターンを指定します。パターンは "//"、""、または '' で囲むことができます。それ以外の場合は、一重引用符で囲みます。パターンにリテラルの空白を使用することはできません。

私は認めざるを得ません: なんと完全に恣意的な制限でしょう!

于 2012-10-24T13:56:17.557 に答える
2

あなたの問題については、実際にはスペースであるデフォルトとしてパターンを指定する必要はありません。

perl -anle 'print "$F[0], $F[-1]"' build_outputfile
于 2012-10-24T14:25:37.750 に答える
0

正規表現パターンは次のようになります。

'/\s+/'

\sは、任意の空白に一致することを意味します

于 2012-10-24T13:46:09.800 に答える