Solaris - パターンで始まるディレクトリ名を取得する

Solaris - パターンで始まるディレクトリ名を取得する

私はgrep -o最新のシステムで許可されていないSun Solaris 10オペレーティングシステムを使用しています。次のディレクトリのリストがあり、DATA[0-9]次に始まるディレクトリを取得しようとしています。

DATA34016
DATA34011
DATA34029
DATA34027
DATA34014
DATA34013
DATA34010
DATA34006
DATA34008
DATA34007
DATA34026
DATA34009
DATA34015
DATA34017
DATA34012
DATA34028
DATA34067
DATA34066
DATA34046
DATA34046dsd
DATA34046ttidid

予想される結果:

DATA34016
DATA34011
DATA34029
DATA34027
DATA34014
DATA34013
DATA34010
DATA34006
DATA34008
DATA34007
DATA34026
DATA34009
DATA34015
DATA34017
DATA34012
DATA34028
DATA34067
DATA34066
DATA34046

私のコマンドに関連する主な問題は次のとおりですDATA34046dsdDATA34046ttidid

注文する:

for i in $(ls -d */ | grep ^'DATA[0-9]'); do echo ${i%%/}; done

答え1

単にawk範囲演算子で使用できます。非常に古いバージョンを使用している場合は、範囲awk間隔フラグを明示的に指定できます。

awk '/^DATA[0-9]{5}$/' file
awk --re-interval '/^DATA[0-9]{5}$/' file

しかし、それでも絶対に解析してはいけませんlsls(1) の出力を分析しない理由、シェルに組み込まれたglob機能を使用します。ディレクトリ名に対してループを実行するには、次のようにします。

for dir in DATA[0-9][0-9][0-9][0-9][0-9]; do
    [ -d "$dir" ] || continue
    printf '%s\n' "$dir"
done

答え2

zshシェルの使用:

setopt extended_glob

for dir in DATA[[:digit:]](#c5)(/); do
    print $dir
done

そうでなければ

printf '%s\n' DATA[[:digit:]](#c5)(/)

拡張されたワイルドカードパターンは、文字列で始まり、後に5桁の数字()が続き、ディレクトリ()を参照するすべての名前DATA[[:digit:]](#c5)(/)と一致します。DATA[[:digit:]](#c5)(/)

関連情報