작은따옴표로 묶인 문자열을 grep에 전달하는 방법은 무엇입니까?

작은따옴표로 묶인 문자열을 grep에 전달하는 방법은 무엇입니까?

내가 기대하는 것은 다음과 같습니다. 디렉토리를 재귀적으로 검색하여 발견된 모든 파일에서 주어진 문자열을 찾습니다. 다음 명령은 일반적으로 사용되는 호출 포트입니다.

find ./ | xargs grep -ns 'foobar'

그러나 따옴표를 사용하면 셸에 foobar프롬프트가 표시 되면서 명령이 실패합니다. >문제를 일으킨 특정 명령은 다음과 같습니다.

find ./ | xargs grep -ns 'add_action(\'save_post\','

백슬래시를 사용하여 따옴표를 이스케이프 처리하려고 시도했지만 소용이 없었습니다. 이를 수행하는 올바른 방법은 무엇입니까?

답변1

작은따옴표는 작은따옴표로 끝나며, 그 사이에 있는 다른 모든 문자는 백슬래시를 포함하여 그대로 유지됩니다. 따라서 작은따옴표 사이에 작은따옴표를 포함할 수 없습니다. (하지만 당신은할 수 있는'Single quotes aren'\''t ever really embedded in single quotes.'작은따옴표를 끝내고 작은따옴표를 이스케이프 처리한 후 ) 와 같이 새로운 작은따옴표 세트를 시작합니다.

제안:grep -r pattern .현재 디렉토리에서 반복적으로 grep을 수행할 수 있는 경우 find+xargs를 사용하지 마십시오.

다음 명령은 동일한 동작을 갖습니다.

grep -rns "add_action('save_post'," .
grep -rns 'add_action('\'save_post\', .

마지막 명령은 다음과 같이 해석됩니다.

  1. 'add_action('->add_action(
  2. \'->'
  3. save_post->save_post
  4. \'->'
  5. ,->,

이러한 부품을 연결하기 위해 grep명령은 매개변수를 받습니다 add_action('save_post',.

답변2

xargs매개변수가 이상한 방식으로 참조될 것으로 예상했지만 find결과는 그렇지 않습니다. 파일 이름에 공백이 포함되어 있지 않다는 것을 모르는 경우에는 xargswith를 함께 사용 하지 마십시오 .find\"'

를 사용하지 않고 xargs, find실행하려는 프로그램을 직접 호출합니다.

find . -exec grep -ns 'add_action('\''save_post'\'',' {} +

를 사용하면 exec … {} +을 사용하는 것처럼 여러 파일에 대해 동시에 한 번 호출됩니다 xargs. 일부 이전 버전에서는 이를 find지원하지 않으므로 각 파일에 대해 한 번 호출하여 +사용해야 합니다 .;grep

find … -print0 | xargs -0유틸리티가 이를 지원하는 경우 해당 유틸리티도 사용할 수 있습니다. 이 -print0옵션은 findnull 바이트로 구분된 이름을 내보내고 따옴표 해석 없이 null로 구분된 입력을 예상하도록 -0지시합니다 .xargs

위의 인용문에 유의하세요. 작은따옴표 사이의 모든 문자는 '리터럴 문자열의 끝을 나타내는 문자를 제외하고 문자 그대로 해석됩니다. 실제로 는 '\''작은 따옴표로 묶인 문자열을 작은 따옴표로 묶은 문자열에 넣는 방법입니다. 공식적으로는 " '끝 따옴표, \리터럴 '작은 따옴표, '시작 따옴표"입니다.

의 특별한 경우 grep, 구현에서 지원하는 경우 디렉토리에서 재귀 검색을 생략 find하고 사용할 수 있습니다.grep -r

grep -r 'add_action('\''save_post'\'',' .

¹ 이러한 기능은 Linux, Cygwin, FreeBSD 및 OSX에서 지원됩니다.

답변3

grep "add_action('save_post'," ./* -R
  1. -R이 옵션을 사용하여 현재 디렉터리의 모든 파일에 대해 반복적으로 grep 할 수 있습니다 .

  2. 검색 문자열은 으로 묶을 수 있습니다 ".

관련 정보