~을 위한여러 개의 빈 줄을 단 하나의 빈 줄로 바꾸기먼저 큰 저장소에서 적용할 파일을 찾아야 합니다. 어떻게 해야 하나요?
답변1
이것pcregrep
이 유틸리티는 여러 줄 패턴의 일치를 지원하므로 쉽습니다.
먼저 내 git 저장소에서 검색할 파일 목록이 필요합니다.자식 검색이를 위해서는 유틸리티가 유용하지만 일반 find(1)
도구와 기타 도구도 작동합니다.
파일 목록을 에 전달하고 pcregrep
출력을 임시 파일에 덤프한 다음 작업하기 전에 파일 목록을 수동으로 확인합니다(예: 첫 번째 목록에 있는 바이너리 제거).
# easy to type version
git find | xargs pcregrep -l -M $'\n\n\n' >/tmp/x
# more secure version
git find -print0 | xargs -0r pcregrep -l -M $'\n\n\n' >/tmp/x
노트:이 $'…'
기능에는 쉘 지원이 필요합니다(GNU bash, AT&T ksh93, mksh, zsh 및 POSIX sh는 모두 향후 표준 릴리스에서 지원됩니다). 그렇지 않으면 을 입력하고 '
Enter를 세 번 누른 후 '
다시 입력합니다.
초기 목록이 충분히 명확하면 결과 목록에서 직접 작업할 수 있습니다.
# easy to type version
$EDITOR $(git find \*.java | xargs pcregrep -l -M $'\n\n\n')
# somewhat more secure version
git find -print0 | xargs -0r pcregrep -l -M $'\n\n\n' | xargs $EDITOR --
⚠ 파일 이름에 다음이 포함되지 않는 한 "더 안전한" 버전이 필요합니다.어느공백도 아닌 "재미있는" 문자! 마지막 예에서 "약간 더 안전하다"는 것은 -l
pcregrep의 옵션이 항상 LF로 출력을 종료하고 NUL로 출력을 종료하는 옵션이 없기 때문에 이 솔루션을 사용하면 줄바꿈이 포함된 파일 이름이 항상 안전하지 않다는 문제를 나타냅니다.
답변2
... -print0 | xargs -r0 awk '
FNR == 1 {n = 0}
$0 == "" {
if (++n == 2) {
print FILENAME
nextfile
}
next
}
{n = 0}'
printf "%s\0", FILENAME
파일 이름을 NUL로 구분하여 변경합니다 . 빈 줄 대신 빈 줄을 확인 $0 == ""
하도록 변경되었습니다 .!NF