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
grep
aで始まるすべてのパラメータが--
オプションだと思いますか? grepが「--」で始まるパターン(ファイルから)を取得できるようにするには、この問題を回避するにはどうすればよいですか?- 最後の試みは「-ver」パターンを使用して行われたため、
grep
そのパターンはオプションとは見なされませんでしたが、grep
「-ver」パターンが含まれているにもかかわらず、ファイルの「--verbose」単語と一致しませんでした。この動作の原因は何ですか?
答え1
この文字列は、--
コマンドラインに表示されるときにほとんどのユーティリティに特別です。それは信号を送るオプション終了コマンドライン引数パーサーに。たとえば、現在のディレクトリから呼び出されたファイルをrm -- -f
削除するためにダッシュで始まるファイル名を渡したい場合に使用されます。-f
--
パターンとして使用するには、ユーティリティにパターンであることをgrep
明示的に教えてください。
grep -e --
オプションは、検索したいパターンである-e
オプション引数を受け入れます。grep
grep
また、使用することができます
grep -- --
ここでgrep
2つ目は、最初のものがオプションになることができない--
としてモードと呼ばれていました。--
ls -a
ファイルの行にが含まれていないため、最後のパイプが返されますr
。このコマンドは、「()と一致しないすべての行抽出」grep -ver
で作成することもできます。grep -v -e r
-v
r
-e r
答え2
タイトルの質問に答えるには(一部の正規表現エンジンでは英数字またはアンダースコアで始まらないスペースで区切られた単語を報告する)、PCREを使用してビルドをサポートしている場合は\w
GNUで実行できます。grep
:
grep -Po '(?<!\S)[^\w\s]\S*'
^
これは、空白以外の文字()が前に()なく、空白以外の文字()が後に来ない場合()単語1()または空白文字()\w
以外の文字()です。\s
(?<!...)
\S
*
\S
入力した内容は次のように返されます。
-a
--verbose
答え3
この問題は次のように解決できますGNU grep
。positive lookarounds
$ grep -oP '(?:(?!\h)\W)+\w+' inp
それを読んで、文字列の私の位置に単語ではなく単語が続くのを見てください。ただし、この単語はスペースを除外します。
出力:
-a
--verbose