저는 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)
(/)