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

내 명령과 관련된 주요 문제는 다음과 같습니다 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)(/)

관련 정보