1

次の行を含むファイルがあります。

SOME COMMAND 34 XXXXX ;
; a comment which may contain a : 
      sometext001 : X00 : 1 ;
                  : X01 : 1 ;
                  : X11 : 1 ;

sometext001そしてgrep/egrepで取得したい。

正規表現の使用^\s*[^:\s;]+\s*:

(つまり: 空白を含む行の先頭から始まり、空白、コロン、セミコロン以外の少なくとも 1 つの文字が続き、その後に空白がいくつかまたはまったくない行が続き、その後にコロンが続きます)

複数行のサポートを有効にすると、オンラインの正規表現テスターhttp://regexr.com?35eamを使用して、テキスト (次を含む:) を一致させることができます。

とにかく、grep/egrep は行ごとに機能するという印象を受けました。では、この例を含むファイルで egrep を使用すると正規表現が機能しないのはなぜですか?

egrep を使用して目的の結果を達成する別の方法はありますか、それが不可能な場合は、シェル スクリプトから呼び出し可能な別のワンライナーを使用しますか?

更新: regex の提案された変更は^[[:space:]]*[^[:space:];]+[[:space:]]*:指定された行に一致しますが、egrep に -o オプションを使用したときに明らかなように、その行で 1 回sometext001 :と 1回、2 回一致します。X00 :これを解決するには?

更新:テスト ファイルには、上記のテキストが正確に含まれていました。コマンドラインはegrep -o '^([[:space:]]*[^:[:space:];]+[[:space:]]*:)' test.txt(()ペアなしでも試行されました)。出力は

      sometext001 :
X00 :        
4

3 に答える 3

1

-Pあなたが持っている正規表現で(正規表現スイッチのようなperl)をよりよく使用する必要があります:

grep -P '^\s*[^:\s;]+\s*:'
于 2013-07-02T13:57:35.370 に答える
0

gnu grep を使用:

grep -Po '^\s*\K[^\s:;]*(?= :)'

あなたの例で:

kent$  echo "SOME COMMAND 34 XXXXX ;
; a comment which may contain a : 
      sometext001 : X00 : 1 ;
                  : X00 : 1 ;
                  : X11 : 1 ;"|grep -Po '^\s*\K[^\s:;]*(?= :)'
sometext001
于 2013-07-02T13:59:02.680 に答える