実行すると、grepの次の動作が観察されます。 5回:

me@asus:~/go/src/company/topology-front$ lsof |grep "READ" vim 4788 me 4u REG 8,2 12288 32247694 /home/me/go/src/company/topology-front/.README.md.swp me@asus:~/go/src/company/topology-front$ lsof |grep "README.md*" vim 4788 me 4u REG 8,2 12288 32247694 /home/me/go/src/company/topology-front/.README.md.swp me@asus:~/go/src/company/topology-front$ lsof |grep "README.md" vim 4788 me 4u REG 8,2 12288 32247694 /home/me/go/src/company/topology-front/.README.md.swp me@asus:~/go/src/company/topology-front$ lsof |grep "*README.md*" me@asus:~/go/src/company/topology-front$ lsof |grep "*README.md" me@asus:~/go/src/company/topology-front$ 

grepの最後の2回の試行で結果が返されない理由がわかりませんでした。

回答

grepパターンは正規表現です(別名regex、regexp、 RE)、-E / -F / iv id = “のいずれかでない限り、基本正規表現(BRE) 895a869911 “>

/ -K / -Xオプション(最初の2つのみが標準)が使用されます。

*は、先行するアトムの0個以上に一致する正規表現演算子です。たとえば、d*は0個以上のdに一致します。BREでは、パターンの開始時または

または\(正規表現演算子、リテラル*のみに一致します(これも使用されます)文字通り[...]ブラケット式内)。

したがって、grep "*README.md*"はリテラルの後にREADMEの後に任意の単一文字(.正規表現演算子)の後にmの後に任意の数のdが続きます。 任意の数値には0が含まれているため、機能的にはgrep "*README.m"と同等です(これは、一致する行に違いはなく、一致する可能性のある行のみに影響します)。行内(たとえば、GNU grep--colorオプションで表示されます))

たとえば、次の2行で一致します:

*README mike ^^^^^^^^^ DONT***README-mddd ^^^^^^^^^^^^ 

^は、行内の一致内容を示します--color

で確認できる正規表現によって

ここでは、正規表現をシェルのワイルドカードパターンと混同しているようです。 0文字以上に一致する*ワイルドカード演算子は、正規表現で.*と記述できます。ただし、次のようにします。

grep ".*README\.md.*" 

これも次と同じになります:

grep "README\.md" 

As grepは、パターンに完全に一致する行を見つけるのではなく、行内で 一致するものを探します(-x)。

ast-open grepを使用します。これは、ksh93のビルトイン(デフォルトでは常にビルトインであるとは限りません。$PATH/opt/ast/binを配置して有効にする必要があります。 >)、grep-Kオプションを使用して、シェルワイルドカード(拡張ksh93のもの)を使用できます。したがって、grepの実装では、次のことができます。

grep -K "README.md" 

または

grep -xK "*README.md*" 

README.mdを含む行で照合する。

同じ実装で、拡張内でワイルドカード照合を有効にすることもできます()、拡張-X)またはperlのような(-P)正規表現(?K)演算子を使用した式(および基本的な正規表現の\(?K\)は、実際にはPOSIX準拠を破るので、私はそれを信頼しません。将来のバージョンで削除される可能性があります)。したがって、次のことができます。

grep -xE "(?K)*README.md*" 

あります。

最新のgrep実装では、次の操作も実行できます。

grep -F README.md 

固定文字列検索の場合(上記の.はリテラル

文字の代わりに)

コメント

  • FWIW:Perlはまたは+があり、grep -P
  • @ilkkachuも同様です。 、grep -Eもいくつかの実装でそうです。その*は、最初はBREにのみ指定されている場合に文字通り扱われます。他のREでは、YMMV。
  • @St é phaneChazelas先頭のアスタリスクの仕様が見つかりませんでした' 。それはどこかに文書化されていますか?私も'プレーンなgrep(またはgrep -G)を使用しています。
  • @iBug、答えをもっと注意深くリードすると、'あなたが何をしているのか(私は思う)'参照しているのは、シェルパターンを使用するast-open 'のgrep -Kです(*は任意の数の文字に一致します。
  • @ iBug、BREの最初の文字のときに*が特別ではないことを意味する場合は、 POSIX仕様

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です