この正規表現がgrepで機能しない理由を誰かが説明できますか?
ls -la ./ | grep -E '^d.*\<\..*\>$'
私が見るには、次の理由で名前が「.」で始まるディレクトリ行を表示する必要があるようです。
- ^d ->文字 "d"で始まる行を保持する
- .* -> なしまたは任意の文字の組み合わせ
- $ -> 行末
問題は、私がこれを理解していないということです。
- \< ->単語の始まり
- 。 ->脱出ポイント
- .* -> なしまたは任意の文字の組み合わせ
- > - >単語の終わり
それで、正規表現のこの部分は、ドットで始まり、文字の組み合わせで終わる単語を含む行を維持すると思います。
grep を使用した正規表現は、この "ls -la" を使用すると結果を表示しません。
[arch dirtest]$ ls -la
total 52
drwxr-xr-x 6 siv users 4096 10 nov 00.41 .
drwx------ 59 siv users 4096 9 nov 23.15 ..
drwxr-xr-x 2 siv users 4096 10 nov 00.41 .test
drwxr-xr-x 2 siv users 4096 10 nov 00.41 test1
drwxr-xr-x 2 siv users 4096 10 nov 00.41 test2
ベストアンサー1
.
あなたの正規表現は単語文字ではないので動作しません。 Grep は、 および のみa-z
単語A-Z
文字で処理します。0-9
_
とにかく、これは本当に正しいことではありません。まず、ls
パーシング非常に壊れやすいそれはほとんど良い考えではありません。名前が次に始まるディレクトリを一覧表示する別の方法は次のとおりです.
。
find . -type d -name '.*'
または、サブディレクトリに移動したくない場合(そしてGNUがある場合はfind
これがLinuxのデフォルトです):
find . -maxdepth 1 -type d -name '.*'
あるいは、echo
Shell globを使用することもできます。
echo .*
ファイルも表示されます。これを防ぐには、次のループを使用してください。
for i in .*; do [ -d "$i" ] && printf '%s\n' "$i"; done