
혼합 인코딩이 포함된 tex 파일 세트가 있습니다. 예: (출력의 하위 세트 file -i *.tex
)
f1.tex: text/plain; charset=utf-8
f2.tex: text/plain; charset=utf-8
f3.tex: text/x-tex; charset=us-ascii
f4.tex: text/plain; charset=iso-8859-1
f5.tex: text/plain; charset=us-ascii
나는 그것들을 모두 로 변환하고 싶습니다 utf-8
. 특히 인코딩된 iso-8859-1
. (또는 유사한 것)을 사용하여 수동으로 이 작업을 수행할 수 있습니다.
iconv -f ISO-8859-1 -t UTF-8 f4.tex > tmp && mv tmp f4.tex
awk
그러나 나는 이것이 위의 조합을 사용하여 가능할 것이라고 생각했습니다 . 즉 file -i
, 를 사용하여 파일/인코딩 조합에 대해 이것을 구문 분석 awk
하고 이에 따라 iconv
.
내 지식은 awk
다소 제한적입니다. 나는 이것보다 더 이상 얻지 못했습니다 :
$ file -i *.tex | awk '{print $1, $3}'
f1.tex: charset=utf-8
f2.tex: charset=utf-8
f3.tex: charset=us-ascii
f4.tex: charset=iso-8859-1
f5.tex: charset=us-ascii
도움을 주시면 감사하겠습니다! 특히 열에서 콜론 :
과 하위 문자열을 어떻게 제거할 수 있는지 모르겠습니다 charset=
.
답변1
awk 대신 sed를 사용하는 것이 훨씬 더 나은 것 같습니다.
file -i *tex | sed \
's/^\([^:]*\): .*set=\(.*\)/iconv -f \2 -t UTF-8 \1 > tmp \&\& mv tmp \1/e'
sed
출력을 기반으로 명령을 실행합니다 file -i
. 실행하지 않고 명령 목록을 보려면 e
다음과 같이 sed 스크립트 끝에 제거 플래그를 추가하면 됩니다.
file -i *tex | sed \
's/^\([^:]*\): .*set=\(.*\)/iconv -f \2 -t UTF-8 \1 > tmp \&\& mv tmp \1/'