programing

모든 파일의 후행 공백을 재귀적으로 제거하는 방법은 무엇입니까?

yellowcard 2023. 5. 20. 10:37
반응형

모든 파일의 후행 공백을 재귀적으로 제거하는 방법은 무엇입니까?

전체 프로젝트의 후행 공백을 모두 제거하려면 어떻게 해야 합니까?루트 디렉토리에서 시작하여 모든 폴더의 모든 파일에서 뒤에 오는 공백을 제거합니다.

또한 모든 것을 stdout으로 출력하는 것이 아니라 파일을 직접 수정할 수 있기를 원합니다.

OS X > = 10.6 Snow Leopard 솔루션입니다.

.git 및 .svn 폴더와 해당 내용을 무시합니다.또한 백업 파일을 남기지 않습니다.

(export LANG=C LC_CTYPE=C
find . -not \( -name .svn -prune -o -name .git -prune \) -type f -print0 | perl -0ne 'print if -T' | xargs -0 sed -Ei 's/[[:blank:]]+$//'
)

동봉된 괄호는 다음을 보존합니다.L*현재 셸의 변수 - 하위 셸에서 실행됩니다.

사용:

find . -type f -print0 | xargs -0 perl -pi.bak -e 's/ +$//'

".bak" 파일을 생성하지 않으려면 다음과 같이 하십시오.

find . -type f -print0 | xargs -0 perl -pi -e 's/ +$//'

zsh 사용자는 찾을 호출을 생략하고 대신 다음을 사용할 수 있습니다.

perl -pi -e 's/ +$//' **/*

▁destro위▁note해▁prevent참고▁to:..git: " " ", " ":-not -iwholename '*.git*'.

도스 새 줄(CR/LF)에서도 작동하고 이진 파일을 피하는상당히 효과적인 두 가지 대안적 접근법:

MIME 유형이 다음으로 시작하는지 확인하는 일반 솔루션text/:

while IFS= read -r -d '' -u 9
do
    if [[ "$(file -bs --mime-type -- "$REPLY")" = text/* ]]
    then
        sed -i 's/[ \t]\+\(\r\?\)$/\1/' -- "$REPLY"
    else
        echo "Skipping $REPLY" >&2
    fi
done 9< <(find . -type f -print0)

Git 저장소별 솔루션을 사용하는 매트(Mat)-I.git grepGit가 이진 파일로 간주하는 파일을 건너뜁니다.

git grep -I --name-only -z -e '' | xargs -0 sed -i 's/[ \t]\+\(\r\?\)$/\1/'

배시에서:

find dir -type f -exec sed -i 's/ *$//' '{}' ';'

을: 을 사용합니다..git: 리지토리, 시가도:-not -iwholename '.git'.

Ack는 이런 종류의 작업을 위해 만들어졌습니다.

grep와 동일하게 작동하지만 .svn, .git, .cvs 등과 같은 곳으로 내려가지 않도록 알고 있습니다.

ack --print0 -l '[ \t]+$' | xargs -0 -n1 perl -pi -e 's/[ \t]+$//'

찾기/그립으로 후프를 건너뛰는 것보다 훨씬 쉽습니다.

Ack은 대부분의 패키지 관리자(ack 또는 ack-grep)를 통해 사용할 수 있습니다.

Perl 프로그램이므로 다운로드하여 실행할 수 있는 단일 파일 버전으로도 사용할 수 있습니다.참조: 확인 설치

이것은 GNU sed 또는 xargs를 사용하지 않는 OSX 10.5 Leopard에서 작동했습니다.

find dir -type f -print0 | xargs -0 sed -i.bak -E "s/[[:space:]]*$//"

제외해야 할 파일이 있으면 주의하십시오(제가 했습니다)!

-prune을 사용하여 특정 디렉토리 또는 파일을 무시할 수 있습니다.Git 저장소에 있는 Python 파일의 경우 다음과 같은 방법을 사용할 수 있습니다.

find dir -not -path '.git' -iname '*.py'

ex

Ex 편집기(Vim의 일부)를 사용해 보십시오.

$ ex +'bufdo!%s/\s\+$//e' -cxa **/*.*

참고: 재귀(bash4 & zsh)의 경우 새로운 글로빙 옵션을 사용합니다.**/*.* .에 의해 사용:shopt -s globstar.

은 당신의 다기능에수있에 할 수 있습니다..bash_profile:

# Strip trailing whitespaces.
# Usage: trim *.*
# See: https://stackoverflow.com/q/10711051/55075
trim() {
  ex +'bufdo!%s/\s\+$//e' -cxa $*
}

sed

사용용을 사용하는 sed확인:SED를 사용하여 후행 공백을 제거하는 방법은 무엇입니까?

find

다스음를예찾다니습트)를 찾습니다.remove_trail_spaces.sh파일에서 후행 공백을 제거하는 경우:

#!/bin/sh
# Script to remove trailing whitespace of all files recursively
# See: https://stackoverflow.com/questions/149057/how-to-remove-trailing-whitespace-of-all-files-recursively

case "$OSTYPE" in
  darwin*) # OSX 10.5 Leopard, which does not use GNU sed or xargs.
    find . -type f -not -iwholename '*.git*' -print0  | xargs -0 sed -i .bak -E "s/[[:space:]]*$//"
    find . -type f -name \*.bak -print0 | xargs -0 rm -v
    ;;
  *)
    find . -type f -not -iwholename '*.git*' -print0 | xargs -0 perl -pi -e 's/ +$//'
esac

검색할 디렉터리에서 이 스크립트를 실행합니다.마에막 OSX서, 그것다끝으로 모든 합니다..bak.

아니면 그냥:

find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;

Spring Framework Code Style에서 권장하는 방법입니다.

찾기를 사용하지 않고 백업 파일을 만들지 않았습니다.

sed -i '' 's/[[:space:]]*$//g' **/*.*

파일 트리의 깊이에 따라 이 버전(짧은 버전)으로 충분할 수 있습니다.

예를 들어 이진 파일도 사용합니다.

파일을 제외하는 대신, 위의 명시적인 화이트리스트의 변형은 당신이 제거하고 싶은 파일 확장자를 기준으로 하고, 언제든지 맛을 볼 수 있도록 계절을 지정하는 것입니다.

find . \( -name *.rb -or -name *.html -or -name *.js -or -name *.coffee -or \
-name *.css -or -name *.scss -or -name *.erb -or -name *.yml -or -name *.ru \) \
-print0 | xargs -0 sed -i '' -E "s/[[:space:]]*$//"

저는 이것을 실행하게 되었는데, 이것은 pojo와 adams 버전을 혼합한 것입니다.

후행 공백과 다른 형태의 후행 공백인 캐리지 리턴을 모두 지웁니다.

find . -not \( -name .svn -prune -o -name .git -prune \) -type f \
  -exec sed -i 's/[:space:]+$//' \{} \;  \
  -exec sed -i 's/\r\n$/\n/' \{} \;

.git 폴더가 있으면 터치하지 않습니다.

편집: 코멘트 뒤에 ".git" 또는 ".svn"이 포함된 파일을 가져갈 수 없도록 약간 안전하게 만들었습니다.하지만 바이너리 파일이 있으면 바이너리 파일에 닿습니다.사용하다-iname "*.py" -or -iname "*.php"나고끝 -type f예를 들어 .py 및 .vmdk 파일만 터치하기를 원하는 경우.

업데이트 2: 이제 줄 끝에 있는 모든 종류의 공간을 바꿉니다(탭도 마찬가지임).

저는 정규 표현을 사용합니다.4단계:

  1. 편집기에서 루트 폴더를 엽니다(Visual Studio Code 사용).
  2. 왼쪽에 있는 검색 아이콘을 누르고 정규식 모드를 활성화합니다.
  3. 검색 줄에 "+\n"을 입력하고 바꾸기 줄에 "\n"을 입력합니다.
  4. 모두 바꾸기를 누릅니다.

이렇게 하면 모든 파일의 각 줄 끝에 있는 모든 후행 공백이 제거됩니다.또한 이러한 요구 사항에 맞지 않는 일부 파일을 제외할 수 있습니다.

이것은 잘 작동합니다.특정 파일 형식에 대한 추가/제거 --message:

egrep -rl ' $' --include *.c *  | xargs sed -i 's/\s\+$//g'

루비:

irb
Dir['lib/**/*.rb'].each{|f| x = File.read(f); File.write(f, x.gsub(/[ \t]+$/,"")) }

다른 많은 답변은 다음을 사용합니다.-E문서화되지 않은 BSD 호환 옵션이기 때문에 이유를 모르겠습니다. -r대신 사용해야 합니다.

은 타기답변사를 사용합니다.-i ''은 그냥 은단지것이 .-i(또는)-i''경우), 왜냐하면 선하는면경, 왜하냐우 입니다.-i바로 뒤에 접미사가 있습니다.

Git 특정 솔루션:

git config --global alias.check-whitespace \
'git diff-tree --check $(git hash-object -t tree /dev/null) HEAD'

git check-whitespace | grep trailing | cut -d: -f1 | uniq -u -z | xargs -0 sed --in-place -e 's/[ \t]+$//'

첫 번째 사람은 깃의 별칭을 등록합니다.check-whitespace이 목록에는 뒤에 공백이 있는 파일이 나열됩니다.두 번째는 달립니다.sed그들 위에.

사용만 합니다.\t[:space:]세로 탭, 폼 피드 및 깨지지 않는 공간은 일반적으로 보이지 않습니다.측정값은 다를 수 있습니다.

이것이 제게 맞는 것입니다(Mac OS X 10.8, 홈브루가 설치한 GNU).

find . -path ./vendor -prune -o \
  \( -name '*.java' -o -name '*.xml' -o -name '*.css' \) \
  -exec gsed -i -E 's/\t/    /' \{} \; \
  -exec gsed -i -E 's/[[:space:]]*$//' \{} \; \
  -exec gsed -i -E 's/\r\n/\n/' \{} \;

후행 공백 제거, 탭을 공백으로 교체, Windows CRLF를 Unix로 교체\n.

흥미로운 점은 모든 파일이 복구되기 전에 이 파일을 3-4번 실행해야 한다는 것입니다.gsed지침들.

언급URL : https://stackoverflow.com/questions/149057/how-to-remove-trailing-whitespace-of-all-files-recursively

반응형