
この正規表現が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
答え2
その後、デバイスの方法を省略しているようですか-D
?
ls -la ./ | grep -D skip '^d.*\<\..*\>$'
\<
とにかく...問題は、単語の初期境界と文字通りの地点を探していることです\.
。ドットは単語文字と見なされないため、常に失敗します。info grep
GNU grepからの引用:
`-w'
`--word-regexp'
... Word-constituent characters are letters, digits, and the underscore.
\<
空白に変更することは安定して動作するようです。しかし、私は出力を解析することがls -la
不安定であり、必要なものを得るより良い方法があるというuser:terdonのコメントに同意します。