2009-09-29 6 views
9

まあ、私はそれらの後にスペースを持っている文字列を抽出したい行の最初の試合でgrepを止めるには?

 
#test.txt 
odsdsdoddf112 test1_for_grep 
dad23392eeedJ test2 for grep 
Hello World test 
garbage 

test.txtというファイルを持っています。私は次の式を使用し、それが

を働い
 
grep -o [[:alnum:]]*.[[:blank:]] test.txt 

その出力は

 
odsdsdoddf112 
dad23392eeedJ 
test2 
for  
Hello 
World 

あるしかし、問題はあるgrepをプリント私はそれが最初の試合の後に停止するようにそれらの後にスペースを持っているすべての文字列、 2行目に進みます。

最初にマッチして次の行に移動するには、ここでどの表現を使用しますか?

この問題は、gawkやその他のツールで解決できますが、grepのみを使用するソリューションに感謝します。

編集 私は、LinuxシステムでGNU grep 2.5.1を使用していますが、それは関連しています。

編集

下記の回答の助けを借りて、私は

 
grep -o ^[[:alnum:]]* test.txt 
grep -Eo ^[[:alnum:]]+ test.txt 

で私の運を試してみましたが、両方は私に正しい答えを与えました。

は今私を驚か何hereが示唆されたが、正しい答えを取得していないとして、私は

 
grep -Eo "^[[:alnum:]]+[[:blank:]]" test.txt 

を使用しようとしたことです。ここで は私の端末で出力

 
odsdsdoddf112 
dad23392eeedJ 
test2 
for  
Hello 
World 

しかしRichieHindleとエイドリアンプロンクからのコメントで、彼らは彼らのシステム上で正しい出力を得たことを示しています。誰も私がなぜ私のシステムで同じ結果を得ていないのか、いくつかのアイデアを持っています。何か案が?どんな助けもありがとう。

編集

まあ、その私の出力が正しくありませんでしたので、grepを2.5.1には、いくつかのバグを持っているようです。私はgrep 2.5.4をインストールしました。今は正しく動作しています。詳細はthis linkをご覧ください。

答えて

7

あなたは何の先頭の空白を持っていないことを確認している場合は、行の先頭にのみマッチし、そしてあなたは、1つまたは複数の英数字を持っているときにのみ一致する+*を変更する^を追加します。 (これは、拡張正規表現を使用するために-Eを追加することを意味します)。

grep -Eo "^[[:alnum:]]+[[:blank:]]" test.txt 

(私も途中から.を削除し、私はそれが何をしていたかわからないんだけど?)

+0

私の端末にあなたのコマンドをコピーしましたが、まったく同じ結果が得られました。 –

+1

@ andrew-dufresne:あなたのテキストファイルに何か不思議なことはありますか? 'od -c test.txt'を試してみてくださいあなたが見たい文字を表示していますか? – RichieHindle

+0

@ RichieHindle:あなたの迅速な対応に感謝します。本当に感謝しています。私はコマンドを実行し、test.txtと同じ文字を持っていました –

1
grep -oe "^[^ ]* " test.txt 
+0

私はあなたのコマンドを貼り付け、私が以前持っていたのと同じ結果を得ました。 –

+1

Hmm - GNU Grep 2.5.3(Ubuntu Hardy)の私のために働きます – BryanH

+0

あなたは正しいです。私のgrepバージョン2.5.1が原因でした。 2.5.4がインストールされ、式が機能しました。ありがとうBryanH。私はあなたの助けに感謝します。 –

0

私たちはごみの前にすべての意味の入力を抽出し、実際には最初の試合で停止したい場合は、-B NUM, --before-context=NUMオプションは、「行に一致する前に、一流のコンテキストの印刷NUMライン」にも有用です。

例:発見質問として

grep --before-context=999999 "Hello World test" 
2

、この前2.5.3のGNUのgrepのバージョンでbugあります。このバグは、行の先頭だけではなく、以前の一致が終了した後にキャレットを一致させることができます。

このバグは、他のバージョンのgrep(Mac OS X 10.9.4など)では引き続き表示されます。

普遍的な回避策はありませんが、一部の例では、空白以外の空白のように、区切り文字を省略して目的の動作を得ることができます。つまり、'[^ ]* 'ではなく'[^ ]*'を検索してください。

+0

これを回答として投稿すると、この情報を簡単に見つけることができます。 –

関連する問題