파이프(|) 제한된 텍스트 파일은 처리를 위해 Windows 응용 프로그램에서 전송됩니다. 처리하는 동안 파일 첫 번째 줄의 첫 번째 열에 특수 문자가 있습니다. Windows에서 전송하기 전 파일이 메모장에 표시되는 방식입니다.
Sector|Name|Manager|...
을 읽을 때 첫 번째 열 섹터는 접두사에 특수 문자가 붙은 것처럼 IFS='|' read -r -a fields < "/uploads/file_data.txt"
읽혀집니다 ."Sector"
내가 이 작업을 수행하면 head -1 "/uploads/file_data.txt" | od -c
인쇄된 값은 다음과 같습니다.
0000000 357 273 277 S e c t o r |
노력했지만 tr -d < //uploads/file_data.txt > /uploads/file_data_temp.txt
도움이 되지 않았습니다. 나중에 업로드되는 파일에 알 수 없는 문자가 있는 경우 이뿐만 아니라 특수 문자를 어떻게 바꾸나요?
답변1
시스템의 "little-endian"/"big-endian" 특성을 지정하기 위해 유니코드 로케일 기반 시스템에서 사용되는 "bom"(바이트 순서 표시)이 있을 수 있습니다.
보다https://en.wikipedia.org/wiki/Byte_order_mark
고맙게도 그 중 하나는 utf-8 로케일용인 것 같습니다. 이는 ASCII 1-177 문자만 예상한다면 좋은 일입니다...
이것을 "확인"하기 위해 (일시적으로) C 로케일을 사용하도록 강제된 sed를 삽입하여 이를 제거할 수 있습니다.
LC_ALL=C sed '1s/^\xEF\xBB\xBF//'
예를 들어 다음과 같이 사용됩니다.
incoming program | LC_ALL=C sed '1s/^\xEF\xBB\xBF//' | somecmd
# or
< incomingfile LC_ALL=C sed '1s/^\xEF\xBB\xBF//' > outputfile
# <incomingfile : will give "incomingfile" content as stdin to sed
# then sed modifies only the first line, replacing the BOM with ""
# (the rest is not touched by sed and is transmitted as-is)
# > outputfile : directs sed output (ie, incomingfile without the BOM) to "outputfile"