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回の試行で結果が返されなかった理由はわかりません。
答え1
grep
パターンは正規表現(regex、regexp、REとも呼ばれます)です。基本的な-E
// -F
// /オプションの1つが使用されていない限り、正規表現(BRE)です-P
(最初の2つだけが標準オプションです)。-K
-X
*
前の項目の 0 個以上に一致する正規表現演算子です。原子。たとえば、d*
0 個以上d
を一致させます。 BREでは、パターンの先頭にある場合、または正規表現演算子の後にある場合にのみリテラルと一致します^
(\(
角括弧式*
内でも文字通り使用されます)。[...]
したがって、grep '*README.md*'
テキスト、単一文字(正規表現演算子)の後に*
任意の数のsが続く行が一致します。 ~からREADME
.
m
d
乱数機能的に同じゼロが含まれますgrep '*README.m'
(これは、一致する行に影響を与えず、行内で一致できるものだけに影響します(たとえば、--color
GNUオプションとして表示されますgrep
)。
たとえば、次の2行に一致します。
*README mike
^^^^^^^^^
DONT***README-mddd
^^^^^^^^^^^^
(^
sは行の内容が正規表現と一致することを示します。これを使用して確認できます--color
。)
ここでは正規表現とシェルワイルドカードパターンを混同しているようです。*
ゼロ個以上の文字に一致する正規表現にワイルドカード演算子を作成できます。.*
ただし、次の操作を行います。
grep '.*README\.md.*'
再び次のようになります。
grep 'README\.md'
grep
ペアを探すとき以内にパターンに正確に一致する行(必要な-x
)を見つけるのではなく、行を使用します。
組み込みgrep
のast-openを使用すると(デフォルトでは常に組み込まれているわけではなく、前に入れて有効にする必要があります)、シェルワイルドカード(拡張ksh93ワイルドカード)を使用するオプションを使用できます。したがって、この実装では次のことができます。ksh93
grep
/opt/ast/bin
$PATH
-K
grep
grep
grep -K 'README.md'
または
grep -xK '*README.md*'
一致にが含まれていますREADME.md
。
同じ実装を使用すると、-E
拡張()でもワイルドカード一致を有効にできます。改善(-X
)またはPerlに似た(-P
)演算子を含む正規表現(?K)
(\(?K\)
実際には、基本正規表現でPOSIX適合性を破るため、将来のバージョンで削除される可能性があるため、これに依存しません)。だからあなたはこれを行うことができます:
grep -xE '(?K)*README.md*'
そこに。
最新のgrep
実装では、次のこともできます。
grep -F README.md
固定文字列の検索に使用されます(.
上記は.
文字ではなくリテラルと一致します)。