![Solaris - 패턴으로 시작하는 디렉토리 이름 가져오기](https://linux55.com/image/158426/Solaris%20-%20%ED%8C%A8%ED%84%B4%EC%9C%BC%EB%A1%9C%20%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%20%EC%9D%B4%EB%A6%84%20%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0.png)
저는 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)
(/)