![ksh에서 정규식 일치](https://linux55.com/image/18386/ksh%EC%97%90%EC%84%9C%20%EC%A0%95%EA%B7%9C%EC%8B%9D%20%EC%9D%BC%EC%B9%98.png)
KSH에서 다음과 같은 작업을 수행하고 싶습니다.
if (( $var = (foo|bar)[0-9]*$ )); then
print "variable matched regex"
fi
가능합니까?
참고로 저는 Version M-11/16/88i
Solaris 10 시스템에서 Ksh를 사용하고 있습니다.
답변1
Ksh에는 정규 표현식이 있지만 일반적인 구문은 없습니다(Solaris 10의 버전).
if [[ $var = *@(foo|bar)*([0-9]) ]]; then …
내부에수동, "조건식" 아래의 괄호 안에 있는 내용을 찾고 "파일 이름 생성" 아래의 패턴 구문을 찾으세요.
답변2
glob 모드와 함께 사용하면 case
효과가 있을 수 있습니다. 복합 패턴은 *(pattern-list)
"주어진 패턴의 0개 이상의 일치"를 의미하며 @(pattern-list)
"주어진 패턴 중 정확히 하나와 일치"를 의미합니다.
matcher() {
typeset var="$1"
case "$var" in
*@(foo|bar)*([0-9])) print "$var matched" ;;
*) print "$var did not match" ;;
esac
}
for var in foo bar baz foo123 abc_foo132 abc_foo123z bar1 1bar1 1bar1a; do
matcher "$var"
done
산출:
foo matched
bar matched
baz did not match
foo123 matched
abc_foo132 matched
abc_foo123z did not match
bar1 matched
1bar1 matched
1bar1a did not match
답변3
왜 사용하지 않습니까?에그레프(1)? 정규식 사용자가 기대할 수 있는 모든 것을 제공합니다.
if echo "$var" | egrep -s '(foo|bar)[0-9]*$' # -s means "silent"
then
...
Solaris에 대한 추가 참고 사항: Solaris의 경우 맨페이지를 확인하는 것이 좋습니다.에그레프- 또 하나 있어요에그레프버전은 /usr/xpg4/bin/egrep
더 많은 옵션을 지원하며 고급 정규식 측면에서 다양한 기능을 제공합니다.
답변4
파티에 늦었다는 건 알지만 이것은 ktf의 해결책이 아닙니다.
if echo "$var" | egrep -s '(foo|bar)[0-9]*$' # -s means "silent"
then
...
당신은 또한 사용할 수 있습니다
if grep -q '(foo|bar)[0-9]*$' <<< "$var" # -q means "quiet" ;-)
then
...
<<<
연산자와 함께 사용되는 이 기술을여기에 문자열. 그러나 다음도 추가해야 합니다.경고하다stderr
: 여기에 있는 문자열을 어딘가의 임시 파일에 기록해야 하기 때문에 읽기 전용 환경에서는 작동하지 않습니다(즉, 보기 흉한 오류 메시지가 표시됩니다 ). 내가 아는 한, echo
파이프를 사용하는 "클래식" 방식은 쓰기 권한 없이도 작동합니다.