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