내 코드베이스에서 문자열이 나타나는지 검색한 다음 파일 이름, 줄 번호 및 코드 슬라이드로 형식화된 출력을 얻고 싶습니다. 출력의 첫 번째 줄에서는 원하는 결과를 얻었지만 다음 줄에서는 원하는 형식이 손실됩니다.
$ find src/ -name "*.js" | xargs grep --null -E -n 'filter\(|map\(' | xargs -0 printf "%-100s%-5s%-100s" > test.txt
출력은 다음과 같습니다. (전체 줄을 보려면 오른쪽으로 스크롤하세요)
src/components/AppRouterSwitch.js 15: return _Routes.map((route, index) => {
src/components/forms/UserEditForm/UserEditForm.js36: const options = UserTypes.map((type, index) => <option key={index} value={type.type}>{type.name}</option>);
src/components/pages/AdminPage/SolutionManagementEditPage/SolutionManagementEditPage.js119: templates:state.templates.filter(item=>item.SOLUTIONID ==id)
src/components/pages/AdminPage/SolutionManagementEditPage/SolutionManagementEditPage.js120: .map(item=>{return{
첫 번째 줄은 내가 원하는 것과 같습니다. 다음 콘텐츠에는 필수 형식이 누락되었습니다. printf 형식 문자열을 종료해도 /n
문제가 해결되지 않습니다.
답변1
find src/ -type f -name '*.js' -exec grep -Hn -E -- 'filter\(|map\(' {} + |
awk -F: '{printf "%-100s%-5s%-100s\n", $1, $2, substr($0, length($1) + length($2) + 3)}'
옵션을 사용하면 단일 파일을 인수로 호출하는 경우에도 파일 이름을 인쇄하게 됩니다 -H
. 깨진 링크와 이름이 지정된 디렉터리를 건너뛰려면 찾기 옵션을 사용하세요 .grep
-type f
*.js
또는 더 간단하게 grep을 완전히 제거하십시오(제안을 주신 @don_crissti에게 감사드립니다).
find src/ -type f -name '*.js' -exec awk '/filter\(|map\(/{printf "%-100s%-5s%-100s\n", FILENAME, FNR, $0}' {} +
답변2
man
조금 불분명합니다. "첫 번째 일치 시 검색이 중지됩니다." - 모든 파일 이름이 인쇄되지만 일치하는 단어 검색이 처음 발생 시 중지됨을 의미합니다.
GNU grep 사람들이 페이지에서는 다음과 같이 명확히 설명합니다.
-l
--files-with-matches
Suppress normal output; instead print the name of each input file from which output would normally have been printed. The scanning of each file stops on the first match. (-l is specified by POSIX.)
예는 다음과 같습니다.
$grep -iR Intel *
2018/jan/cpu.txt:Intel i9
2018/motherboard.txt:Intel Motherboard
hardware.txt:Intel Corei7
#the same result as you provided;
$grep -iRl Intel *
2018/jan/cpu.txt
2018/motherboard.txt
hardware.txt
#the desired result