grepは0.2の代わりに0で行を削除しますか?

grepは0.2の代わりに0で行を削除しますか?

次のような内容のファイルがあります。

0
0
0.2
0
0
0
0

ゼロを含むすべての行を削除する必要があります。
を使用したいが、grep -v "0"0.2を含む行も削除されます。そのオプションが利用可能であることがわかりました-wが、それも機能しないようです。

ゼロが1つだけ含まれる行をすべて削除し、ゼロで始まるすべての行を保持するにはどうすればよいですか?

答え1

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 $.

-w0最初の項目は0.02「単語」と見なされ、失敗するため、この行は一致します。これは「シルバー」文字が後に来るためです。 ieなしで元のコマンドを実行すると、-vこれを見ることができますgrep -w "0"

答え2

grepを使用してください:

grep -v '^0$' file

^行の始まりを示し、$行の終わりを示します。

答え3

しかし、grep できるこの目的のために(別の答えで明確にわかるように)一歩後退して実際に欲しいものが何であるか考えてみましょう。

  • 以下を含むファイルがあります。数字
  • 以下に基づいてフィルタリングを実行しようとしています。数値

正規表現は文字シーケンスデータを解釈します。彼らは数字を理解しておらず、個々の数字(そしてその一般的な組み合わせ)だけを理解しています。特別な場合は、この制限を簡単に解決できますが、これは最終的に要件が一致しないことです。

ここで使用すべき妥当な理由がない限りgrep(他のツールを使用することをお勧めします(たとえば、測定した結果はるかに効率的で効率が重要です)。

awkたとえば、次の数値比較に基づいてフィルタリングできます。

awk '$1 == 0' your_file

そして、ゼロより大きい数値を含むすべての行を取得するには、次のようにします。

awk '$1 > 0' your_file

私は正規表現が好きです。これは素晴らしいツールです。しかしこれではありませんただツール。ことわざのように、あなたが持っているものが正規言語だけなら、grepすべてが正規言語のように見えます。

答え4

行を削除したいときのみを含む0 次は次の行です次のコマンドを実行して、これらの行を選択できます。

grep -v "^0$"

0これにより発生した項目のみが印刷されます。行末でそして行の先頭に同時に。その後、オプションは-v私たちの選択を裏返します。

関連情報