작은 따옴표를 사용할 때 grep에서 큰 따옴표를 사용 하시겠습니까?


20

파일에서 간단한 패턴 "hello"를 검색하는 동안 다음과 같은 grep 형식이 모두 작동합니다.

  • grep hello file1
  • grep 'hello'file1
  • grep "hello"file1

위 양식 중 하나가 작동하지만 다른 양식이 작동하지 않는 특정 사례가 있습니까? 다른 것을 대신 사용하면 차이가 있습니까?

답변:


25

이것은 실제로 쉘에 따라 다릅니다. 따옴표 (둘 중 하나)는 주로 공백을 처리하기위한 것입니다. 예를 들어 다음과 같습니다.

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"문자열을 찾습니다.


주목해야 할 것은 원래 질문에서 grep은 실제로 매번 똑같은 주장을 받고 있다는 것입니다.
MikeyB

2
조심해 $정규 표현식의 줄 끝이므로 $VAR1실제로는 아무것도 일치하지 않아야합니다. GNU grep에서 작동하지만 여전히 그 동작에 의존하지 않습니다. \$VAR1리터럴 문자열을 안전하게 일치 시켜야 합니다. (큰 따옴표
Steven Pritchard

7

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"

여기서 백 슬래시 ( " \")는 쉘에 다음 문자를 그대로 적용하고 확장하지 않도록 지시합니다.

그러나 다중 문자열 연결 방식으로 끝내야하는 경우가 있습니다. 실제로 예제를 제시 할 수는 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.