답변:
다음을 시도하십시오 :
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
네 개의 공백을 원하면 다음을 시도하십시오.
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
's/\t/ /g'
한 줄에 두 개 이상의 탭을 교체 해야합니다 .
find ./ -type f -exec sed -i ’s/\t/ /g’ {} +
"(즉, " +
"대신 " \;
")를 수행하는 상당한 속도 향상 find
(그리고 개인적으로 지원하지 않는 버전을 만나지 않았지만 POSIX 표준은 아님) 일부 시스템에서는 발생할 수 있습니다. -exec command {} +
설명서의 " "를 참조하십시오 . sed
모든 파일 에 대해 하나의 인스턴스를 시작하는 대신 시스템이 지원하는만큼의 파일 이름 인수 (시스템에서 getconf ARG_MAX
= 2097152) 로 인수 목록을 작성 xargs
하므로 훨씬 적은 sed
프로세스 를 시작 합니다.
sed
이해하지 못합니다 \t
. 리터럴 탭 문자로 바꿀 수 있습니다.이 문자는로 입력 할 수 있습니다 [Ctrl]+V, [Tab]
.
이를 수행하는 많은 방법이 있습니다. 주의를 기울이지 않거나 Linux에 익숙하지 않은 경우이 작업을 수행하는 동안 발을 쏠 수있는 방법이 많이 있습니다. find
편집기와 같은 것을 사용 하거나 수동으로 변환하여 변환하려는 파일 목록을 작성할 수 있다고 가정하면 해당 목록을 다음으로 파이프하십시오.
while read file
do
expand "$file" > /tmp/expandtmp
mv /tmp/expandtmp "$file"
done
당신이 발로 자신을 쏠 수있는 한 가지 방법은 오타를 만들어 빈 파일을 지정한 모든 파일 이름으로 가져 와서 모든 파일의 내용을 삭제하는 것입니다. 따라서 백업 한 작은 파일 세트에서 먼저 수행하는 작업을주의하여 테스트하십시오.
mv
의 성공 여부를 조건부로 지정하십시오 expand
.expand ... && mv ...
expand -t 4
탭을 4 칸으로 확장하는 것을 잊지 마십시오 . 또한이 방법은 후행 줄 바꿈을 만들 수 있습니다. 그러나 그렇지 않으면 작동합니다.
이게 낫다:
find . -name *.java ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
/tmp/e
다른 파일을 사용하는 경우 파일이 엉망이되기 때문에 사용하는 것이 좋지 않습니다 . 두 명의 사용자가 동시에 이것을 사용하려는 것처럼.
다음 요구 사항을 염두에두고이 문제를 해결했습니다.
"확장"을 사용하면 파일을 적절하게 수정할 수 없으므로 마지막 요구 사항을 충족하기가 가장 어려웠습니다.
나는 다음 해결책을 생각해 냈다.
find . -type f -regextype egrep -regex '.*\.(c|cpp|h|hpp)' -print0 | xargs -0 -n 1 -P 10 -IFILE bash -c ' ( echo "Processing FILE..." && expand -t 4 "FILE" > /tmp/expand.$$ && mv /tmp/expand.$$ "FILE" ) || exit 255'
다음은 몇 가지 설명입니다.
expand
했으므로 텍스트의 정렬을 유지하려고합니다.