~에 따르면이 스레드:
Q: ack는 Perl에서 파생된 정규식을 사용한다고 알고 있습니다. 이것이 맞습니까?
대답: 그렇습니다. 실제로 ack는 Perl로 작성되었으며 표현식을 내부 엔진으로 전달합니다.
이제 현재 디렉터리에 다음과 같은 파일이 있습니다.
media_group_xml_producer.py
내가 할 때 :
> ack -n '.*group.*producer.*'
또는 더 직접적으로:
> ack -n --python '.*group.*producer.*'
결과가 없습니다. 내가 아는 한 정규식은 파일과 일치해야 합니다. 왜 그것을 놓쳤습니까?
답변1
현재 디렉토리에서 파일 이름을 grep해야 하는 경우
ack는 파일 이름이 아니라 파일 내용과 일치합니다. 이름이 정규 표현식과 일치하는 파일을 찾으려면 파일 이름 목록에 대해 ack를 실행하세요.
ls | ack '.*group.*producer.*'
당신은 무엇을 했나요?
ack -n '.*group.*producer.*'
현재 디렉토리에서 파일을 찾습니다포함하다정규식과 일치하는 항목입니다.
하위 디렉터리 경로를 포함한 전체 파일 이름에 대해 정규식을 실행하려는 경우
ls
경로와 파일 이름을 인쇄하는 옵션이 없으므로 자르지 않습니다. 대신 (들여쓰기 행을 인쇄하지 않음) 및 (전체 파일 이름 인쇄) tree
플래그를 사용하십시오.-i
-f
tree -if | ack 'shepherd.*\.pyc?'
반품
./models/shepherd.py
./models/shepherd.pyc
./services/shepherd-related/flock_of_sheep.py
./services/shepherd-related/flock_of_sheep.pyc
물론 위의 모든 내용 grep
은 및 에 적용됩니다 ack
. 하지만 ack
모든 면에서 확실히 더 좋습니다. :-)
답변2
당신은 ack
뭔가를 오해했습니다. grep
시뮬레이션이 아니라 시뮬레이션 입니다 find
. 패턴과 일치하는 파일 이름을 검색하지 않고 주어진 패턴에 대한 파일 내용을 검색합니다. 당신은 사용해야합니다
find -regex '.*group.*producer.*'
또는
find -name '*group*producer*'
이것을 사용하겠다고 고집한다면 ack
(비록 말이 안 된다고 생각하지만) 출력을 구문 분석하여 파일을 얻을 수 있습니다.
$ ack -f | ack '.*group.*producer.*'
media_group_xml_producer.py
실제로 아무것도 검색하지 않고 검색 중인 모든 파일을 인쇄 하고 ack -f
, 두 번째 파일은 정규식과 일치하는 파일 이름을 인쇄합니다.