Grep은 기본 이름에서 정규식을 찾았지만 전체 이름을 반환합니다.

Grep은 기본 이름에서 정규식을 찾았지만 전체 이름을 반환합니다.

텍스트 파일에 파일 목록이 있다고 가정해 보겠습니다.

...
/foo/barfoo
/bar/foo/foobar
/foobar/bar/foo
...

이 텍스트 파일을 검색하는 스크립트가 있는데, 찾기 명령과 마찬가지로 파일의 기본 이름을 검색할 수 있기를 원합니다. 지금까지 나는 이 grep 명령을 사용해 왔으며 grep -E */.*${1}[^/]*$정규 표현식을 grep하려는 경우를 제외하고는 잘 작동합니다. 따라서 위의 예에서 "foo"로 시작하는 파일을 찾으려면 그렇게 하겠지만 myscript --basename ^foo전체 정규식은 grep -E */.*^foo[^/]*$분명히 실패하기 때문에 실패할 것입니다. xargs를 사용하여 각 항목을 기본 이름에 삽입하는 것을 고려했지만 마지막에 전체 파일 경로를 출력하려면 스크립트가 필요합니다.

어떤 아이디어가 있나요? 나는 POSIX 준수를 선호하지만 GNUisms도 좋습니다.

답변1

foo기본 이름의 시작 부분에서 일치해야 하는 경우 :

< inputfile grep '/foo[^/]*$'
  • /foo[^/]*$: 문자열 뒤에 문자열 끝이 아닌 /foo임의 개수의 문자가 오는 문자열 과 일치합니다./

if는 foo기본 이름의 어느 위치에서나 일치할 수 있습니다.

< inputfile grep 'foo[^/]*$'
  • foo[^/]*$: 문자열 뒤에 문자열 끝이 아닌 foo임의 개수의 문자가 오는 문자열 과 일치합니다./

답변2

grepPCRE(Perl 호환 정규 표현식)를 지원하는 경우 :

$ grep -Po '.*/\Kfoo[^/]*$' file.txt 
foobar
foo
  • .*/마지막 항목과 일치 /하고 \K일치 항목을 삭제합니다.

  • foo[^/]*$다음으로 시작하는 파일 이름을 찾습니다.foo

관련 정보