파일에서 간단한 패턴 "hello"를 검색하는 동안 다음과 같은 grep 형식이 모두 작동합니다.
- grep hello file1
- grep 'hello'file1
- grep "hello"file1
위 양식 중 하나가 작동하지만 다른 양식이 작동하지 않는 특정 사례가 있습니까? 다른 것을 대신 사용하면 차이가 있습니까?
파일에서 간단한 패턴 "hello"를 검색하는 동안 다음과 같은 grep 형식이 모두 작동합니다.
위 양식 중 하나가 작동하지만 다른 양식이 작동하지 않는 특정 사례가 있습니까? 다른 것을 대신 사용하면 차이가 있습니까?
답변:
이것은 실제로 쉘에 따라 다릅니다. 따옴표 (둘 중 하나)는 주로 공백을 처리하기위한 것입니다. 예를 들어 다음과 같습니다.
grep hello world file1
"world"및 "file1"이라는 파일에서 "hello"라는 단어를 찾습니다.
grep "hello world" file1
file1에서 "hello world"를 찾습니다.
작은 따옴표 나 큰 따옴표 사이의 선택은 검색 문자열에 변수 또는 평가할 기타 항목이 포함 된 경우에만 중요합니다. 작은 따옴표를 사용하면 문자열이 문자 그대로 사용되며 확장이 수행되지 않습니다. 큰 따옴표를 사용하면 변수가 확장됩니다. 예를 들어 (Bash 또는 ZSH와 같은 Bourne 파생 쉘 사용) :
VAR="serverfault"
grep '$VAR' file1
grep "$VAR" file1
첫 번째 grep
는 file1에서 리터럴 문자열 "$ VAR1"을 찾습니다. 두 번째는 "$ VAR"변수를 확장하고 file1에서 "serverfault"문자열을 찾습니다.
$
정규 표현식의 줄 끝이므로 $VAR1
실제로는 아무것도 일치하지 않아야합니다. GNU grep에서 작동하지만 여전히 그 동작에 의존하지 않습니다. \$VAR1
리터럴 문자열을 안전하게 일치 시켜야 합니다. (큰 따옴표
James는 정확하지만 더 많은 데이터를 추가하기 위해 생각하는 가장 좋은 방법은 명령에 대한 인수라고 생각합니다. "hello"와 "world"를 두 개의 인수로, "hello world"를 하나로 설정 하시겠습니까? 논의.
또한 큰 따옴표는 단순한 변수 이상의 해석을 허용합니다. 정확히 셸에 따라 다르지만 기록 확장, 괄호 확장 및 파일 이름 확장을 확인하십시오.
또한 단일 인수에서 두 유형의 따옴표를 모두 사용해야하는 경우가 있다는 점도 중요합니다. (기본적으로) 인수는 공백으로 구분되므로 공백을 남기지 않으면 여전히 동일한 인수를 지정합니다.
대부분의 쉘의 작은 따옴표 메커니즘은 특수 문자를 허용하지 않으므로 다른 작은 따옴표의 인스턴스는 이스케이프 된 것처럼 보이더라도 따옴표를 끝냅니다. 따라서 작은 따옴표로 묶은 문자열 안에 작은 따옴표가있는 문자열을 전달할 수 없으므로 큰 따옴표를 사용해야합니다. 작은 따옴표와 해석되는 것을 포함하는 인수를 전달하려고 할 때 고통 스러울 수 있지만 원하지는 않습니다. 예를 들어, 리터럴 문자열 "` '$ VAR'is a variable"을 전달하려면 다음과 같이해야합니다.
"'"'$VAR'"' is a variable"
실제로 3 개의 인용 이스케이프 된 문자열이 연결되어 있습니다.
"'"
'$VAR'
"' is a variable"
또는 따옴표가 제거 된 상태 :
'
$VAR
' is a variable
실제로 대부분의 껍질을 사용하면 다음과 같이 할 수도 있습니다.
"'\$VAR' is a variable"
여기서 백 슬래시 ( " \
")는 쉘에 다음 문자를 그대로 적용하고 확장하지 않도록 지시합니다.
그러나 다중 문자열 연결 방식으로 끝내야하는 경우가 있습니다. 실제로 예제를 제시 할 수는 없습니다.