グループ grep コマンド

グループ grep コマンド

私はgrepから始めsて含めたくありませんm

私は効果的なこのソリューションを試しました。

ls | grep -Ev "^s" | grep "m"

grepただし、単一のコマンドでこれを実行しようとすると失敗します。

ls | grep -E '^[^s]*m*'

理由を説明できません。 1つのコマンドで実行できますかgrep

答え1

これは必要ありませんgrep

printf '%s\n' [!s]*m*

テスト:

$ touch small big larger enormous much
$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 Oct 24 13:20 big
-rw-r--r--  1 kk  wheel  0 Oct 24 13:20 enormous
-rw-r--r--  1 kk  wheel  0 Oct 24 13:20 larger
-rw-r--r--  1 kk  wheel  0 Oct 24 13:20 much
-rw-r--r--  1 kk  wheel  0 Oct 24 13:20 small
$ printf '%s\n' [!s]*m*
enormous

ファイル名ワイルドカードパターン[!s]*m*はで始まらないsm

mただし、最初の文字のみを含むファイル名は見つかりません。

mまたはで始まらないが、sを含むファイルmと、で始まるファイルをそれぞれ見つけてこれを行うことができますm。メンテナンスが少し面倒でコードを読んでも、それが何をしているのかすぐにはわかりません。

$ printf '%s\n' [!ms]*m* m*
enormous
much

またはfind読みやすいIMHOを使用してください。

$ find . -maxdepth 1 -name '[!s]*' -name '*m*'
./enormous
./much

答え2

*正規表現に間違った内容を使用しているようです。

仕様(grepのマニュアルページ参照)には次のように指定されています。

*      The preceding item will be matched zero or more times.

したがって、正規表現は「文字以外のもので始まるすべてのファイル名と一致し、s0回以上一致し、文字が0回以上一致しますm。」を意味します。

正規表現は次のように変更する必要があります。

ls | grep -E '^[^s][[:alnum:]]*m'

つまり、あなたは指摘する必要があります記号は「m」の前に0回以上現れなければなりません。ファイル名に-またはを含めることができる場合に_置き換えます。[[:alnum:]][[:print:]]

極端な場合、ファイル名も機能する場合スタートを使用するときのm正規表現は次のとおりです。

ls | grep -E '(^m|^[^s][[:print:]]*m)'

答え3

まず、解析しないでくださいls。その他には、その質問に回答させていただきますgrep

あなたが使用に固執するなら、grepあなたが望むものは次のとおりです。

grep -E "^[a-rt-zA-RT-Z][[:alnum:]]*m" file

実際、次のことなく動作します-E

grep "^[a-rt-zA-RT-Z][[:alnum:]]*m" file 

sこれは、or以外の文字で始まるすべての文字を印刷し、その後に含まれるS英数字mとそれ以降のすべての文字を印刷しますm。実際、それはあなたが探している結果を提供します。

printf上記の最初の解決策は解析を必要としないため、ファイルを処理するときははるかに優れていますls。上記の方法はファイル名と一緒に使用できますが、grepそれに反対することをお勧めし、ファイルの内容やデータと一緒に使用することをお勧めします。

find解析は不要なので、ファイルにも使用できます。

find /path/to/directory -type f -name "*m*" -name "[!s]*"

環境によっては脱出が必要な場合があります。*

find /path/to directory -type f -name "\*m\*" -name "'[!s]\*"

関連情報