저는 Unix를 처음 접했고 우연히 호기심을 발견했습니다. 일부 셸 구성(예: case
또는 find
)은 패턴 일치를 사용하지만 정확히 정규 표현식은 아닙니다. ed
, 및 같은 다른 명령은 sed
패턴 일치를 위해 정규식을 사용합니다. 정규식을 사용하는 쉘 명령(내장, 프로그램)과 다른 유형의 패턴 일치를 사용하는 명령을 나열할 수 있습니까?vi
awk
답변1
답변2
정규식을 사용할 때의 주요 차이점은 전체 문자열을 일치시켜야 하는지 여부입니다. case
와 다른 bash 명령 에서는 find
전체 문자열을 일치시켜야 하고, 등에서는 sed
문자열 awk
의 grep
일부를 일치시켜야 합니다. 그 외에는 유사하지만 확실히 동일하지는 않습니다.
예를 들어, case
bash 셸의 문에서 정규식을 사용하는 경우 정규식이 전체 문자열을 설명한다고 가정합니다. 즉 (나는여기 예)
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
명령 과 달리 case
xdb-1.host.com 행은 해당 문자열에서 검색 패턴을 찾을 수 있으므로 인쇄됩니다. 따라서 전체 문자열을 일치시키는 것이 아니라 패턴의 발생을 찾는 것이 아이디어입니다.
마찬가지로 find
명령에 정규식을 사용하는 경우 전체 문자열이 일치해야 합니다. 예를 들어,
find / -regextype sed -regex ".*\.dat"
확장자가 dat인 모든 파일이 검색됩니다. 하지만 다음을 sed
사용하여 동일한 검색을 시도하면
find / | sed -nr '/.*\.dat/'
파일 이름에 ".dat" 문자열이 포함된 모든 파일과 일치합니다.
물론 미묘한 구문 차이가 있습니다. 예를 들어, 다음과 같이 하면
find / -name "*.dat"
이것도 정규식입니다. 여기서 *는 "임의의 기호"를 의미하지만, 엄밀히 말하면 정규식에서는 ".*"를 써야 합니다. 여기서 "."는 임의의 기호를 의미하고 *는 임의의 수의 "." 유형을 의미합니다. 따라서 임의의 수의 임의 기호를 함께 나타냅니다.