작은따옴표가 포함된 문자열을 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

xargsfind생성되지 않는 이상한 방식으로 인용된 인수를 기대합니다 . 파일 이름에 공백이 포함되어 있지 않다는 것을 알지 않는 한 xargs와 함께 사용하지 마십시오 .find\"'

를 사용하는 대신 실행하려는 프로그램을 직접 호출 xargs해 보겠습니다 .find

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

를 사용하면 exec … {} +프로그램은 와 같이 한 번에 여러 파일에 대해 한 번 호출됩니다 xargs. 의 일부 이전 버전은 여기에서 find지원되지 않습니다 . 그러면 파일당 한 번씩 호출하는 대신 +사용해야 합니다 .;grep

find … -print0 | xargs -0유틸리티에서 지원하는 경우 대신 사용할 수 있습니다 .1. 이 -print0옵션은 find널 바이트로 구분된 이름을 내보내도록 지시하고, 널로 구분된 입력을 예상하고 인용 해석을 수행하지 않도록 -0지시합니다 .xargs

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

의 특별한 경우 grep, 구현이 이를 지원하는 경우에는 1을 사용하지 않고 디렉토리 내부를 재귀적으로 검색하는 데 find사용할 수 있습니다.grep -r

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

¹ Linux, Cygwin, FreeBSD 및 OSX는 이러한 기능을 지원합니다.

답변3

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

  2. 검색 문자열은 로 둘러싸일 수 있습니다 ".

관련 정보