私は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*
はで始まらないs
がm
。
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.
したがって、正規表現は「文字以外のもので始まるすべてのファイル名と一致し、s
0回以上一致し、文字が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]\*"