3

これは大学での質問です。

testfiles問題は、拡張子のないフォルダ内のすべてのファイル/ディレクトリを一覧表示することです。
与えられた正しい答えはこれです:

ls testfiles | grep -v "\."

さて、ls正規表現がどのように機能するかを理解するために、誰かがこれを使用するだけでどうなるかを私に説明lsしてもらえますか?$さらに、名前が。で終わることを具体的に示すために、ドル記号も使用する例をいただければ幸い.[a-z]です。

どんな助けでも、本当に感謝しています。

もう一つ!この質問に対する別の答えは、次を使用することです。

ls testfiles | grep "^[^.]*$"

それはどのように読まれますか?私はこのように読んだ^[^.]*$

^      -> does not contain
[^.]   -> starts with a dot
*      -> repeated zero or more times
$      -> till the end

誰かに訂正してもらいたい…ありがとう!

4

4 に答える 4

3

Unixユーティリティはフィルタとして使用することを目的としていたため、実際のアプリケーションに最も近いので、与えられた答えは理にかなっています。

grep "\."ただし、それはすべてを「ピリオド」(したがって、拡張子)とgrep -v "\."一致させ、他のすべて(つまり、補数)と一致することを理解しています。

何が拡張であることが意図されているのか、何がそうでないのかを誰が言うことができるので、コマンドをすでにあるものよりも正確にするのは難しいですか?


パート2:ls testfiles | grep "^[^.]*$"

角かっこ式は、[と]で囲まれた文字のリストです。そのリスト内の任意の1文字に一致します。リストの最初の文字がcaret^の場合、リストにない任意の文字と一致します。たとえば、正規表現[0123456789]は任意の1桁に一致します。

http://unixhelp.ed.ac.uk/CGI/man-cgi?grep

つまり、^[^.]*$実際には次のことを意味します。

文字列で始まり、文字列で終わるもの。それぞれがピリオドではありません。

最初の注意は否定ではなく、で始まることを意味します。2番目の注意点は「not」記号です。

于 2013-03-25T00:14:02.217 に答える
3

修正:

^      -> pattern starts at the beginning of the string
[^.]   -> matches something that is not a dot
*      -> repeated zero or more times
$      -> and must continue to match (only non-dot items) until the end

したがって、最初から最後までドット以外のものだけが含まれている必要があります。

于 2013-03-25T00:16:26.217 に答える
3

さて、ls regexがどのように機能するかを理解するために、誰かがlsだけを使用してこれがどのように[実行]されるかを説明してもらえますか?

あなたは無視フラグでそれをすることができます:

ls -I '*.*'

注-CentOS6で動作し、他のLinuxディストリビューションについてはわかりません。

于 2013-03-25T00:26:20.010 に答える
0

質問にのタグを付けたので、grepは必要ありません。

shopt -s extglob
(cd testfiles && ls -d !(*.*))

http://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matchingを参照してください

于 2013-03-25T00:37:22.447 に答える