私は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
私のコマンドに関連する主な問題は次のとおりですDATA34046dsd
。DATA34046ttidid
注文する:
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
しかし、それでも絶対に解析してはいけませんls
。ls(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)
(/)