쉘 스크립트에서 대소문자를 구분하지 않는 하위 문자열 검색

쉘 스크립트에서 대소문자를 구분하지 않는 하위 문자열 검색

명령 출력에서 ​​대소문자를 구분하지 않는 하위 문자열 일치를 수행하는 쉘 스크립트를 어떻게 작성할 수 있습니까?

답변1

쉘 옵션을 설정하면 bash정규식 연산자를 사용하여 기본적으로 대소문자를 구분하지 않는 하위 문자열 일치를 수행할 수 있습니다. 예를 들어=~nocasematch

s1="hElLo WoRlD"
s2="LO"

shopt -s nocasematch

[[ $s1 =~ $s2 ]] && echo "match" || echo "no match"
match

s1="gOoDbYe WoRlD"
[[ $s1 =~ $s2 ]] && echo "match" || echo "no match"
no match

답변2

먼저 대소문자를 무시하지 않는 간단한 예제 스크립트는 다음과 같습니다.

#!/bin/bash
if [ $(echo hello) == hello ]; then
    echo it works
fi

오른쪽의 hello 문자열을 변경해 보면 더 이상 echo가 발생하지 않습니다 it works. echo hello원하는 명령으로 바꿔 보세요 . 대소문자를 무시하고 문자열에 개행 문자가 포함되어 있지 않은 경우 grep을 사용할 수 있습니다.

#!/bin/bash
if echo Hello | grep -iqF hello; then
    echo it works
fi

여기서 핵심은 명령 출력을 로 파이프한다는 것입니다 grep. 이 if명령문은 파이프에서 가장 오른쪽 명령(이 경우 grep)의 종료 상태를 테스트합니다. Grep은 일치하는 항목을 찾은 경우에만 성공적으로 종료됩니다.

grep 옵션은 -i대소문자를 무시한다는 의미입니다.
-q옵션은 출력을 내보내지 않고 첫 번째 일치 후에 종료함을 의미합니다.
-F옵션은 인수를 정규식 대신 문자열로 처리한다는 의미입니다.

첫 번째 예에서는 직접 비교가 가능한 연산자와 다양하고 유용한 연산자를 사용합니다. 두 번째 형식은 단순히 명령을 실행하고 종료 상태를 테스트합니다.[ expression ]

답변3

needle변수 값에서 변수 값에 대한 대소문자 구분 문자열 검색 haystack:

case "$haystack" in
  *"$needle"*) echo "present";
  *) echo "absent";
esac

대소문자를 구분하지 않는 문자열 검색의 경우 둘 다 동일한 대소문자로 변환하세요.

uc_needle=$(printf %s "$needle" | tr '[:lower:]' '[:upper:]' ; echo .); uc_needle=${uc_needle%.}
uc_haystack=$(printf %s "$haystack" | tr '[:lower:]' '[:upper:]' ; echo .); uc_haystack=${uc_haystack%.}
case "$uc_haystack" in
  *"$uc_needle"*) echo "present";;
  *) echo "absent";;
esac

GNU coreutils 는 tr멀티바이트 로케일(예: UTF-8)을 지원하지 않습니다. 멀티바이트 로케일을 사용하려면 대신 awk를 사용하세요. awk를 사용한다면 변환 대신 문자열 비교를 수행하도록 할 수 있습니다.

if awk 'BEGIN {exit !index(toupper(ARGV[2]), toupper(ARGV[1]))}' "$needle" "$haystack"; then
  echo "present"
else
  echo "absent"
fi

BusyBox는 tr이 구문을 지원하지 않습니다. 대신 사용할 수 있습니다. BusyBox는 ASCII가 아닌 로케일을 지원하지 않습니다.[:CLASS:]tr a-z A-Z

bash(sh는 아님) 4.0+에는 대소문자 변환을 위한 내장 구문과 더 간단한 문자열 일치 구문이 있습니다.

if [[ "${haystack^^}" = *"${needle^^}"* ]]; then
  echo "present"
else
  echo "absent"
esac

관련 정보