lsをgrepにパイプします。 grepがlsコマンドの出力を無視するのはなぜですか?

lsをgrepにパイプします。 grepがlsコマンドの出力を無視するのはなぜですか?

私はこのコマンドを使用して、ls -p | egrep "\<[A-Z]+\>"ディレクトリ名に/が追加されたすべての大文字ファイルとディレクトリ名を印刷しようとしています。ファイル/ディレクトリ名をすべて大文字でgrepするようにしましたが、私のコマンドが機能する理由を理解できませんでした。正しい出力が得られましたが、grepがXXX /などのディレクトリを一覧表示する方法を理解していません。

ベストアンサー1

あなたの質問は、「大文字()以外の文字があっても拡張正規DIRNAME/表現と一致するのはなぜですか?」です。\<[A-Z]+\>/

あなたの正規表現は、以下を含むすべての項目と一致します。言葉すべて大文字:

$ printf '%s\n' "this is not matched" "this IS matched" | egrep "\<[A-Z]+\>"
this IS matched

幅が0の「単語の境界」、つまり「単語の文字」と、対応する型ではない文字(または行の先頭/末尾)の間のスペースと一致します\<\>単語文字はクラスのすべての文字[[:alpha:]_](文字と下線)です。

DIRNAME/あなたの表現は後に一致するものと一致します(DIRNAME前と後にD単語の境界がありますE)。


ディレクトリリストから特定の名前をフィルタリングするには、その他の行ベースのgrepテキスト操作ツールを使用しないでください。ファイル名に改行文字を含めることができるため、ファイル名に制限がない限り、行ベースのツールは正しい操作を実行するのが難しくなります。

代わりに、ディレクトリからすべての大文字の名前を取得するには、次の手順を実行しますbash

$ ls -p -d *
DIR/     FILE     TEST123  dir/     file     test123
$ ls -p -d !(*[[:lower:]]*)
DIR/     FILE     TEST123

これを行うには、shopt -s extglob拡張グロービングモードを有効にする必要があります。拡張ワイルドカードパターンは、小文字が!(*[[:lower:]]*)含まれていないすべての項目と一致します。

/このパターンは、ディレクトリ名に何が追加されるかは関係ありませんls -p。これは、パターンがファイル名と一致し、文字を含むファイル名がないためです/。また、スキーマが拡張されました。今後 ls呼び出されます。

数字を含む名前も消去するには、次のようにします。

$ ls -p -d !(*[[:lower:][:digit:]]*)
DIR/  FILE

(1つ以上の小文字または数字を含む名前は含まれていません。)または、

$ ls -p -d !(*[[:lower:]]*|*[[:digit:]]*)
DIR/  FILE

(ただし、小文字が1つ以上含まれる名前や数字が1つ以上含まれる名前は含まれません。)

おすすめ記事