공백이 포함된 grep 출력에서 ​​xargs grep을 수행하는 방법은 무엇입니까?

공백이 포함된 grep 출력에서 ​​xargs grep을 수행하는 방법은 무엇입니까?

정규식을 기반으로 파일을 검색한 다음 해당 파일의 내용을 검색하려고 합니다. 예를 들어 다음과 같은 것이 있습니다.

#Find all C++ files that match a certain pattern and then search them
find . -name "*.cpp" | grep "<name regex>" | xargs grep "<content regex>"

내가 겪고 있는 문제는 일부 경로에 공백이 있다는 것입니다 xargs. 이는 인수(및 인수 ) 를 find사용 하여 . 비슷한 것이 있나요 ?-print0-0xargsgrep

아니면 내가 완전히 잘못된 방향으로 가고 있는 걸까? 순진하게 말하면 find나 에게는 이해 grep가 되지만 xargs grep동일한 결과를 생성하는 다른 방법에도 열려 있습니다.

답변1

어쩌면 비슷한 것을 사용할 수도 있습니다(gnu grep인 경우).

grep -r 'content pattern' --include==*.cpp

사람들은 grep

--include=GLOB 기본 이름이 GLOB와 일치하는 파일만 검색합니다(--exclude에 설명된 대로 와일드카드 일치 사용).

빈 구분 기호에 대한 옵션도 참조하세요.

-Z, --null 일반적으로 파일 이름 뒤에 오는 문자 대신 0바이트(ASCII NUL 문자)를 출력합니다. 예를 들어, grep -lZ는 일반적인 개행 대신 각 파일 이름 뒤에 0바이트를 출력합니다. 이 옵션을 사용하면 파일 이름에 개행과 같은 특이한 문자가 포함된 경우에도 출력이 명확해집니다. 이 옵션은 find -print0, perl -0, sort -z 및 xargs -0과 같은 명령과 함께 사용하여 임의의 파일 이름, 개행 문자가 포함된 파일 이름도 처리할 수 있습니다.

-z, --null-data 입력을 줄 집합으로 처리하며, 각 줄은 개행 문자 대신 0바이트(ASCII NUL 문자)로 끝납니다. -Z 또는 --null 옵션과 마찬가지로 이 옵션은 sort -z와 같은 명령과 함께 사용하여 임의의 파일 이름을 처리할 수 있습니다.

답변2

많은 어려움을 겪어야 한다면 어쨌든 xargs의 효율성은 상실됩니다. 대략적인 해결 방법은 다음과 같습니다.

find . -iname "*.cpp" | grep "<pattern>" | while read -r x; do grep exa "$x"; done

파일 이름의 공백 문제가 발생할 때마다 대답은 변수에 큰따옴표였습니다.

답변3

find모든 파일 이름 필터링을 수행 하는 데 사용됩니다 . 대신에

find . -name "*.cpp" | grep "foo" | xargs grep …

하다

find . -name "*.cpp" -name "*foo*" -print0 | xargs -0 grep …

다음과 같이 약간 더 복잡한 작업을 수행하고 싶다면

find . -name "*.cpp" | egrep "foo|bar" | xargs grep …

넌 할 수있어

find . -name "*.cpp" "(" -name "*foo*" -o -name "*bar*" ")" -print0 | xargs -0 grep …

다음 내용이 포함된 파일에도 적용되어야 합니다.개행 문자그들의 이름으로.

그리고 완전한 정규식의 강력한 기능이 필요한 경우 를 사용할 수 있습니다 -regex.

답변4

이는 GNU 도구 없이도 작동합니다.

#Find all C++ files that match a certain pattern and then search them
find . -name "*.cpp"  | grep "<name regex>" | perl -pe 's/\n/\0/' \
  | xargs -0 grep "<content regex>"

perl호출은 줄 바꿈을 널 문자로 대체하므로 xargs -0입력이 공백이 아닌 줄로 해석될 수 있습니다.

GNU를 사용하면 호출을 제거 perl하고 xargs -0 …다음으로 변경할 수 있습니다.xargs -d "\n" …

GNU가 없나요 perl? 시도 awk '{printf "%s%c", $0, 0}'해봐.

관련 정보