実行すると、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
divの前に/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
固定文字列検索の場合(上記の.
はリテラル
文字の代わりに)
+
があり、grep -P
grep -E
もいくつかの実装でそうです。その*
は、最初はBREにのみ指定されている場合に文字通り扱われます。他のREでは、YMMV。grep
(またはgrep -G
)を使用しています。grep -K
です(*
は任意の数の文字に一致します。*
が特別ではないことを意味する場合は、 POSIX仕様