쉘 패턴 일치 및 정규식의 출현

쉘 패턴 일치 및 정규식의 출현

저는 Unix를 처음 접했고 우연히 호기심을 발견했습니다. 일부 셸 구성(예: case또는 find)은 패턴 일치를 사용하지만 정확히 정규 표현식은 아닙니다. ed, 및 같은 다른 명령은 sed패턴 일치를 위해 정규식을 사용합니다. 정규식을 사용하는 쉘 명령(내장, 프로그램)과 다른 유형의 패턴 일치를 사용하는 명령을 나열할 수 있습니까?viawk

답변1

case사용구체, 이는 정규식과 유사한 매우 간단한 패턴 일치 시스템입니다. 예를 들어 일부 도구는 find실제로 다음을 지원합니다.둘 다(이 경우 -name및 를 통해 -regex). 하지만 상황은 더 복잡합니다. 다양한 상황이 있습니다.정규식. 일부 도구는 하나만 지원하고 일부 도구는 여러 개를 지원합니다. 각 도구와 버전 조합에 대한 페이지나 기타 참조 문서의 내용을 확인하면 됩니다 man(그래도 파악하기 어렵습니다). 참조 목록은 엄청날 것이며 이것이 매우 유용한 답변이라고 생각하지 않습니다.

답변2

정규식을 사용할 때의 주요 차이점은 전체 문자열을 일치시켜야 하는지 여부입니다. case와 다른 bash 명령 에서는 find전체 문자열을 일치시켜야 하고, 등에서는 sed문자열 awkgrep일부를 일치시켜야 합니다. 그 외에는 유사하지만 확실히 동일하지는 않습니다.

예를 들어, casebash 셸의 문에서 정규식을 사용하는 경우 정규식이 전체 문자열을 설명한다고 가정합니다. 즉 (나는여기 예)

case $SERVER in
db-[0-9]+\.host\.com) echo "DB server"
;;
*)echo "Unknown server"
;;
esac

db-[0-9]+.host.com은 "db-"로 시작하고 하나 이상의 숫자를 거쳐 마지막으로 ".host.com"으로 끝나는 문자열을 설명하므로 db-1 .host입니다. .com은 일치하지만 xdb-1.host.com은 일치하지 않습니다.

이제 를 보고 sed비슷한 방식으로 검색 패턴을 작성하면

echo "xdb-1.host.com"| sed -nr '/db-[0-9]+\.host\.com/p'

sed명령 과 달리 casexdb-1.host.com 행은 해당 문자열에서 검색 패턴을 찾을 수 있으므로 인쇄됩니다. 따라서 전체 문자열을 일치시키는 것이 아니라 패턴의 발생을 찾는 것이 아이디어입니다.

마찬가지로 find명령에 정규식을 사용하는 경우 전체 문자열이 일치해야 합니다. 예를 들어,

find / -regextype sed -regex ".*\.dat"

확장자가 dat인 모든 파일이 검색됩니다. 하지만 다음을 sed사용하여 동일한 검색을 시도하면

find / | sed -nr '/.*\.dat/'

파일 이름에 ".dat" 문자열이 포함된 모든 파일과 일치합니다.

물론 미묘한 구문 차이가 있습니다. 예를 들어, 다음과 같이 하면

find / -name "*.dat"

이것도 정규식입니다. 여기서 *는 "임의의 기호"를 의미하지만, 엄밀히 말하면 정규식에서는 ".*"를 써야 합니다. 여기서 "."는 임의의 기호를 의미하고 *는 임의의 수의 "." 유형을 의미합니다. 따라서 임의의 수의 임의 기호를 함께 나타냅니다.

관련 정보