2016-06-26 8 views
2

は、以下の内容を考えます。また、パターンがラインの真ん中にある可能性があるので、(正面の二重引用符のような)言葉の声に頼るのは嫌です。最初の行のgrepと一致する方法は?私は<code>1</code>ある<code>Bar</code>値の最初の出現にマッチしたい</p> <pre><code>title="Bar=1; Fizz=2; Foo_Bar=3;" </code></pre> <p>:

は、ここに私の試みです:

$ grep -o -m1 'Bar=[ ./0-9a-zA-Z_-]\+' input.txt 
Bar=1 
Bar=3 

私は-m/--max-count使用してきたのnum試合後のファイルの読み取りを停止すると仮定し、それがうまくいきませんでした。このオプションが期待どおりに機能しないのはなぜですか?

私はhead -n1と混ぜることができましたが、grepでこれを達成できるかどうかは疑問です。複数の一致がライン上に見出される(及び-oで個々に出力されている)場合であっても -

答えて

2

grep-mを使用する場合、それは明らかにの点でマッチをカウントするよう [1] 、配向され。

私は一人でgrepの問題を解決するために知っているではないだろうが(GNUgrepさん-Pオプションを除き - anubhava's helpful answerを参照)、awkは(ポータブル的に)それを行うことができます。

$ awk -F'Bar=|;' '{ print $2 }' <<<"Bar=1; Fizz=2; Foo_Bar=3;" 
1 

フィールド名を含める必要がある場合はprint "Bar=" $2を使用してください。
stdin(いわゆるhere-string)による入力を提供する<<<の方法は、Bash、Ksh、Zshに固有です。 POSIX準拠が必須の場合は、代わりにecho "..." | grep ...を使用してください。


[1]オプション-m-ogrep POSIX spec.ない一部であるが、GNUおよびBSD/OSX grep両方は、それらをサポートし、行ベースのロジックを実装することを選択しました。
grep -o -c 'Bar=[ ./0-9a-zA-Z_-]\+' <<<"Bar=1; Fizz=2; Foo_Bar=3;"収率:
これは、「選択線」、即ち、にマッチの数をカウント標準-cオプションと一致しています。gnu grepにperlのベースの正規表現の風味を使用して

+1

++で最適化することができますternative – anubhava

2

あなたが使用することができます。

grep -oP '^(.(?!Bar=\d+))*Bar=\d+' <<< "Bar=1; Fizz=2; Foo_Bar=3;" 
Bar=1 

(.(?!Bar=\d+))*は、このようになってBar=\d+パターンを持っていない任意の文字の0回以上にマッチします、我々は最初に一致することを確認Bar=\d+

=の後に値を印刷する場合は、次のようにします。

grep -oP '^(.(?!Bar=\d+))*Bar=\K\d+' <<< "Bar=1; Fizz=2; Foo_Bar=3;" 
1 
1

あなたはgrepの中でそれを達成するためにgrep -P先(あなたがGNU grepの上にあると仮定した場合)と、正見((?=.*Bar))を使用することができます。

echo "Bar=1; Fizz=2; Foo_Bar=3;" | grep -oP -m 1 'Bar=[ ./0-9a-zA-Z_-]+(?=.*Bar)' 
+1

@ anubhavaよりもあなたの答えは分かりやすいかもしれませんが、 'Bar =' only _once_を含む行に一致するものが見つからないという明白な欠点があります。 – mklement0

1

まずバーでライン開始を作るためにはgrepを使用して、取得行の先頭にバー:

grep -o "Bar=.*" input.txt | grep -o -m1 "^Bar=[ ./0-9a-zA-Z_-]\+" 

あなたは大きなファイルがある場合、あなたはAl系の良いawkのため

grep -o -m1 "Bar=.*" input.txt | grep -o -m1 "^Bar=[ ./0-9a-zA-Z_-]\+" 
+1

'grep -o -m1 'Bar = [./0-9a-zA-Z_-]\+' input.txt | OP自身が可能性として言及している「head -n 1」は、概念的にははるかに単純です(実際には問題はないかもしれませんが、より効率的で速いでしょう)。しかしもっと重要なのは、OPは_single_ 'grep'呼び出しで問題を解決しようとしていることです。私は "grep"でそれを達成することは可能でしょうか? "彼は 'grep'の複数の呼び出しが許容可能な解決策であることを暗示することを意味しませんでした。 – mklement0

+1

@ mklement0大部分は同意します。営業担当者がここで本当に(遅く複雑な)二重grepを探していないとコメントしたとき、私は自分の答えを削除します。 –

関連する問題

 関連する問題