2011-10-21 4 views
2

나는 내 코드베이스를 검색하는데 ACK을 사용 해왔다. 훌륭한 도구이다. 그러나 그것은 내 의견으로는 하나의 중요한 한계를 가지고 있습니다. 정규 표현식의 다중 행 일치를 허용하지 않습니다.ACK를 필터로 사용하기

그 한계를 극복하기 위해 특정 표현식이 포함 된 파일 집합을 필터링 한 다음 두 번째 표현식을 찾는 필터를 다시 필터링합니다. 두 표현식이 같은 줄에 없을 가능성이 높습니다. , .cvs의 DIRS을 무시하고,

ack -l --type=java "(List|Collection|Map|Set)" | ack --type=java "String" 

그리고 자바 파일로 내 검색을 제한 할 수 있기 때문에 차라리, grep를 사용하지 않는 게 좋을 : 나는 (이 아무 것도 반환하지 않습니다) 성공하지, 다음 명령을 실행 시도했습니다 .svn dirs, etc. (무언가 ack 기본값) 아이디어가 있으십니까?

답변

4

현재 명령 줄은 일치하는 파일 목록을 검사 할 다른 파일 집합으로 사용하지 않고 파일 목록에서 ack를 실행합니다. 즉, 당신이 두 번째 ACK 호출을 실행할 수있는 파일의 집합으로 첫 번째 명령의 출력을 치료하는 데 사용할 도구

ack -l --type=java "(List|Collection|Map|Set)" > files 
ack "String" files 

xargs입니다 수행과 같은 것.

ack --print0 -l --type=java "(List|Collection|Map|Set)" | xargs -0 ack "String" 

--print0는 xargs를 올바른 파일명 (여기서 홀수 캐릭터 안에있다)를 얻을 수 있도록 널 문자에 의해 파일명을 분리한다. xargs에 대한 -0 플래그는 파일 이름이 널 (null) 구분이 될 것으로 예상합니다.

관련 문제