次のような内容のファイルがあります。
0
0
0.2
0
0
0
0
単一のゼロですべての行を削除する必要があります。
を使用することを考えてgrep -v "0"
いましたが、これにより0.2を含む行も削除されます。私は-w
このオプションを使用できると見ましたが、これも機能していないようです。
単一の0のみを含むすべての行を削除し、0で始まるすべての行を保持するにはどうすればよいですか?
-w
、ここで失敗するで答えられます。
次のような内容のファイルがあります。
0
0
0.2
0
0
0
0
単一のゼロですべての行を削除する必要があります。
を使用することを考えてgrep -v "0"
いましたが、これにより0.2を含む行も削除されます。私は-w
このオプションを使用できると見ましたが、これも機能していないようです。
単一の0のみを含むすべての行を削除し、0で始まるすべての行を保持するにはどうすればよいですか?
-w
、ここで失敗するで答えられます。
回答:
grep -vx 0
からman grep
:
-x, --line-regexp
Select only those matches that exactly match the whole line.
For a regular expression pattern, this is like parenthesizing
the pattern and then surrounding it with ^ and $.
-w
最初の入力0
が0.02
「単語」と見なされ、したがってこの行が一致するため、失敗します。これは、「非単語」文字が後に続くためです。これを確認するには、を使用せず-v
に元のコマンドを実行しますgrep -w "0"
。
-F
正規表現パターンを使用していないため、このオプションを使用することもできます。プレーンストリングマッチングのみ
-F
(意外にも)には、同じくらいの時間がかかるか、わずかに遅くなる(約5〜10%)ようです。したがって、その利点が何であるかはわかりません。
grep
メタ文字のない正規表現の特別なケースがあると思われます。これは一般的なユースケースであるためです。それは驚きだfgrep
遅くなるだろうが、それは短いパターンをコンパイルしながら、この特別なケースに気付いてのオーバーヘッドが大きいファイルをスキャンする時間が無視できる対であることを驚くことではありません。(これほど高速に処理するために特別なケースが必要な場合と、文字クラスまたはx.*y
。のパターンの場合。)
grep
以外の文字を\n
行区切り文字として認識するかどうかは忘れます。そうでない場合、暗黙的で^
あり、の$
ような固定文字列検索に変わりstrstr(big_buf, "\n0\n")
ます。(または0\n
、バッファーの開始時。)しかし、大きなバッファーに到達する可能性のある最初の一致を探しているだけでなく、効率的にフィルター処理したいのです。とにかく、理論的には、はい、それは各行の先頭にある2バイトのmemcmpです。fgrepとgrepの両方がそれを認識できることを望みます。
grepで:
grep -v "^0$" file
^
行の始まりを意味し、行の$
終わりを意味します。
[a-Z0-9]
一方でgrep
できる(他の回答を明確に示したように)このために使用すること、のステップバックを取ると、あなたが実際に欲しいものを考えてみましょう:
正規表現は、文字シーケンスデータを解釈します。彼らは数字については知らず、個々の数字(およびその通常の組み合わせ)についてのみ知っています。特定のケースでは、この制限を回避する簡単なハックがありますが、最終的には要件の不一致です。
grep
ここで使用する非常に正当な理由がない限り(たとえば、測定し、非常に効率的で、効率が重要な場合)、別のツールを使用することをお勧めします。
awk
たとえば、次のような数値比較に基づいてフィルタリングできます。
awk '$1 == 0' your_file
ただし、ゼロより大きい数値を含むすべての行を取得するには、次のようにします。
awk '$1 > 0' your_file
正規表現が大好きです。素晴らしいツールです。しかし、それだけがツールではありません。ことわざにあるように、あなたが持っているものがすべての場合grep
、すべてが通常の言語のように見えます。
printf '0\n1\n-1\na\nb\n0\n0 also\n0.0\n-0.0\n0*0\n' | awk '($1 == 0)'
と一致します:0
、0.0
および-0.0
...と0 also
!「0」だけではありません。(必要な場合もあれば、そうでない場合もあります)。ユーザーが「0」のみを必要とする場合:(awk '/^0$/'
またはgrep '^0$'
)。また、編集する必要があります。ユーザー!
はテストを無効にするために追加する必要があるため0
、残りを非表示(および他のゼロ)に表示します。例:awk '!( $0 == 0)'
$1 == "0"
>
ために!=
(または同等に! (… == …)
)ではなく明示的に使用しました。あなたの他のコメントについては、これは完全に真実ですが、その後、基本的に文字列比較の領域とgrep
作品を使用した既存のソリューションに戻ります(awk
もちろん、作品も機能します)。
$0=="0"
行は削除したいときにだけ含まれている0
次の行に続いて次のコマンドを発行して、それらの行を選択することができます。
grep -v "^0$"
これはのみの出現に印刷されます0
されている行の終わりと、行の先頭に同時にします。この-v
オプションは選択を反転します。
-v
ため、動作しません。
-v
オプションで読み間違えました、ありがとう!
grep -v "\b0\b"
grep -v "^0$"
-wは機能しますが、ドット文字は単語の区切り文字であるため、0.2は2つの単語です。
grep -v "\b0\b"
ここでは実際には機能しません。どのバージョンのgrepを使用していますか?
grep (BSD grep) 2.5.1-FreeBSD
MacOSの上やgrep (GNU grep) 2.16
Ubuntuで
\<
して\>
単語の境界として、それは同じ効果があります-w