grepを使用して単語以外の文字で始まる単語を検索する

grepを使用して単語以外の文字で始まる単語を検索する

test.txt ファイルの内容は次のとおりです。

ls -a
cmake --verbose
verbose

grepこのファイルを見て、「--」で始まる単語(例:「--verbose」)だけを探したいと思います。

ただし、次のパターンをパラメータとして使用すると機能grepしません。

$ cat testing.txt | grep -- 
Usage: grep [OPTION]... PATTERN
   [FILE]... Try 'grep --help' for more information.

$ cat testing.txt | grep -
ls -a
cmake --verbose

$ cat testing.txt | grep '--v'
grep (GNU grep) 3.1
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

$ cat testing.txt | grep ver
cmake --verbose
verbose

$ cat testing.txt | grep '-ver'
ls -a
  • grepaで始まるすべてのパラメータが--オプションだと思いますか? grepが「--」で始まるパターン(ファイルから)を取得できるようにするには、この問題を回避するにはどうすればよいですか?
  • 最後の試みは「-ver」パターンを使用して行われたため、grepそのパターンはオプションとは見なされませんでしたが、grep「-ver」パターンが含まれているにもかかわらず、ファイルの「--verbose」単語と一致しませんでした。この動作の原因は何ですか?

答え1

この文字列は、--コマンドラインに表示されるときにほとんどのユーティリティに特別です。それは信号を送るオプション終了コマンドライン引数パーサーに。たとえば、現在のディレクトリから呼び出されたファイルをrm -- -f削除するためにダッシュで始まるファイル名を渡したい場合に使用されます。-f

--パターンとして使用するには、ユーティリティにパターンであることをgrep明示的に教えてください。

grep -e --

オプションは、検索したいパターンである-eオプション引数を受け入れます。grepgrep

また、使用することができます

grep -- --

ここでgrep2つ目は、最初のものがオプションになることができない--としてモードと呼ばれていました。--


ls -aファイルの行にが含まれていないため、最後のパイプが返されますr。このコマンドは、「()と一致しないすべての行抽出」grep -verで作成することもできます。grep -v -e r-vr-e r

答え2

タイトルの質問に答えるには(一部の正規表現エンジンでは英数字またはアンダースコアで始まらないスペースで区切られた単語を報告する)、PCREを使用してビルドをサポートしている場合は\wGNUで実行できます。grep:

grep -Po '(?<!\S)[^\w\s]\S*'

^これは、空白以外の文字()が前に()なく、空白以外の文字()が後に来ない場合()単語1()または空白文字()\w以外の文字()です。\s(?<!...)\S*\S

入力した内容は次のように返されます。

-a
--verbose

答え3

この問題は次のように解決できますGNU greppositive lookarounds

 $ grep -oP '(?:(?!\h)\W)+\w+' inp

それを読んで、文字列の私の位置に単語ではなく単語が続くのを見てください。ただし、この単語はスペースを除外します。

出力:

 -a
 --verbose

関連情報