$ 및 '?와 같은 정규식 메타 문자가 포함된 문자열을 찾는 방법은 무엇입니까?

$ 및 '?와 같은 정규식 메타 문자가 포함된 문자열을 찾는 방법은 무엇입니까?

현재 디렉토리와 아래의 모든 파일에서 하위 문자열을 검색하고 싶습니다 $form['#node']. 그래서 처음에는 다음을 시도했습니다.

grep -R "\$form\[\\\\'" .그리고grep -R "\$form\[\'" .

하지만 아무런 결과도 반환하지 않습니다. 하지만,

grep -R "\$form\["$form['#id']파일에 또는 같은 항목의 인스턴스가 있기 때문에 많은 수의 결과가 반환됩니다 . $form['#node']이스케이프된 작은따옴표를 추가하면 문제가 발생합니까? 이 경우 작은따옴표를 이스케이프 처리하는 방법에 대한 명확한 지침을 찾을 수 없는 것 같습니다.

이 경우 이스케이프 문자가 예상대로 작동하는지 확인해야 합니다.

답변1

내 생각에 해당 스위치를 사용하면 고정 문자열을 찾도록 -F지시하는 것 같습니다 .grep

$ grep -F "\$form['#node']" file.txt

샘플 파일.

$ cat file.txt
$form['#node']
abc$form['#node']abc
123$form['#node']123
blah blah $form['#node']
someotherstring

샘플 실행.

$ grep -F "\$form['#node']" file.txt 
$form['#node']
abc$form['#node']abc
123$form['#node']123
blah blah $form['#node']

노트:$문자열을 둘러싼 큰따옴표는 약하고 Bash 쉘이 이를 변수 이름으로 생각하는 것을 막지 못하기 때문에 달러 기호를 이스케이프 처리해야 합니다.

답변2

이것은 당신이 정말로 원하는 경우이지만사용-F-F여기에 없는 유일한 특수 문자 [는 이스케이프해야 하는 유일한 문자입니다.~을 위한grep, $셸을 위해 이스케이프해야 하지만 정규식 연산자이기는 grep하지만 해당 위치에 있지 않기 때문에 이스케이프할 필요가 없습니다. 쉘 와일드카드이지만 큰따옴표 안에는 포함되지 않습니다.$[

grep -r "\$form\['#node']" .

작동해야합니다. 물론 @slm이 지적했듯이 -F여기서 사용하지 말아야 할 이유는 없습니다.

grep -Fr "\$form['#node']" .

(GNU grep(최소한 최신 버전) 의 경우 실제로 심볼릭 링크를 통과할 의도가 없다면 -r이것이 선호됩니다 -R.)

답변3

이건 어때?

egrep "\\\$form\['"

답변4

작은따옴표는 정규식에서 특별한 의미가 없으며 패턴이 이미 큰따옴표로 묶여 있으므로 이를 이스케이프할 이유가 없습니다. 특수 문자가 아니기 때문에 이스케이프 처리하면 작동하지 않으며 패턴이 깨집니다.

따라서 필요한 것은 다음과 같습니다 "\$form\['".

$ cat file.txt 
$form['#node']
abc$form['#node']abc
123$form['#node']123
blah blah $form['#node']
someotherstring

$ grep  "\$form\['" file.txt 
$form['#node']
abc$form['#node']abc
123$form['#node']123
blah blah $form['#node']

관련 정보