Grep -H는 두 일치 항목이 같은 줄에 있을 때 항상 파일 경로를 반환하지 않습니다.

Grep -H는 두 일치 항목이 같은 줄에 있을 때 항상 파일 경로를 반환하지 않습니다.

나는 grep을 사용하여 파일을 재귀적으로 살펴보고 패턴과 일치하는 모든 문자열을 추출합니다. 파일 경로를 인쇄하고 싶습니다: 일치하는 문자열.

-H should print the file path for each entry

-o should print just the matched string, omitting everything else on the line I don't want

-r recursive search.

난 달린다:

grep -Hro [pattern] .

대부분의 일치 항목은 파일 이름을 인쇄하지만 일부는 일치하는 문자열만 인쇄합니다. -o가 파일 이름을 자르기 때문에 -H와 -o는 상호 배타적입니까? 예제 출력:

./path/foo.txt: foo
./path/bar.txt: foo
./path/baz.txt: foo
foo
./path/baz.txt: foo

네 번째 foo 일치 항목에도 연관된 파일이 있어야 하지만 인쇄되지는 않습니다.

나는 이렇게 행동한다우편 엽서, 하지만 -H 플래그를 사용했는데 "/dev/null" 솔루션도 작동하지 않습니다.

$ grep --version
grep (BSD grep) 2.5.1-FreeBSD

편집하다:

추가 탐색 후에 정규식은 파일 이름에 대한 모든 일치 항목을 얻지 못했으며 두 문자열이 같은 줄에서 일치할 때 둘 다 발생했습니다. 예를 들어 다음 텍스트 파일은

foo
foo sometext foo
foo

산출

./path/foo.txt: foo
./path/foo.txt: foo
foo
./path/foo.txt: foo

두 개의 일치 항목이 파일 이름을 인쇄하도록 하는 솔루션을 아는 사람이 있습니까?

답변1

아니요, 상호 배타적이지 않습니다 -H. -o일치하는 부분에 캐리지 리턴이 있을 수 있습니다. 이렇게 하면 다음 텍스트가 줄 시작 부분에 기록되어 파일 이름을 덮어쓰게 됩니다.

$ printf 'foobar\n' | grep -Ho '.bar'
(standard input):obar

$ printf 'foo\rbar\n' | grep -Ho '.bar'
bar

또한 이 두 줄은 동일한 파일에 속하므로 baz.txt(예제가 올바른 경우) 긴 줄(화면 너비보다 큼)이 다음 줄로 넘어가는 경우에도 발생할 수 있습니다.

$ printf 'foo%80sbar\n' | grep -Ho 'foo.*'
(standard input):foo
       bar

이러한 시나리오 중 하나가 귀하의 사례에 적용되는지 여부는 실제로 검색 정규식과 파일 내용에 따라 다릅니다.

관련 정보