cut의 필드 구분자를 확인합니다
printf 'name:12:ok\nplain\n' | cut -d : -f 2
printf 'name:12:ok\nplain\n' | cut -s -d : -f 2첫 명령은 12와 plain을 출력합니다. 구분자가 없는 줄은 기본적으로 그대로 통과하기 때문입니다. -s를 넣은 둘째 명령은 12만 출력합니다. 기본 필드 구분자는 탭이며, -d로 지정한 공백 한 개와 awk의 공백 묶음 구분도 같은 동작이 아닙니다.
바이트 선택 -b와 문자 선택 -c는 개념이 다릅니다. 설치한 GNU cut의 멀티바이트 지원은 버전을 확인해야 합니다. UTF-8 한글을 바이트 중간에서 자르면 유효한 문자가 남지 않을 수 있습니다. CSV의 따옴표와 내부 쉼표를 cut -d ,만으로 파싱하지 않습니다.
LANG보다 우선하는 설정이 있을 수 있습니다
locale
locale -a
LC_ALL=C sort names.txtLC_ALL이 설정되어 있으면 각 항목의 locale 설정보다 우선합니다. 그다음 해당 LC_* 항목과 LANG을 확인합니다. 현재 명령에만 LC_ALL=C를 주면 정렬·문자 분류 등을 C locale 기준으로 실행합니다. 시스템 전체 환경을 영구히 바꾸는 명령은 아닙니다.
- 저장된 바이트UTF-8 등의 인코딩으로 파일에 저장됩니다.
- 해석 규칙locale과 프로그램의 지원 범위를 확인합니다.
- 문자 처리정렬·대소문자·공백 판단이 그 규칙을 사용합니다.
번호는 해석 과정을 나타냅니다. locale을 바꿨다고 파일의 인코딩 바이트가 자동 변환되지는 않습니다.
isspace에 음수 char를 그대로 넣지 않습니다
#include <ctype.h>
#include <stddef.h>
size_t count_spaces(const char *s)
{
size_t count = 0;
for (; *s != '\0'; ++s) {
if (isspace((unsigned char)*s))
++count;
}
return count;
}ctype 함수에는 EOF 또는 unsigned char로 표현할 수 있는 값을 전달해야 합니다. char가 signed인 구현에서는 상위 비트가 있는 바이트가 음수가 될 수 있으므로 위처럼 변환합니다. 이 예제는 NUL로 끝나는 바이트 문자열이며, UTF-8의 모든 유니코드 공백을 알아보는 함수는 아닙니다.
fgetc의 반환값은 먼저 int에 받아 EOF인지 검사합니다. EOF를 unsigned char로 먼저 변환하면 정상 바이트와 종료 표시를 구분하기 어려워집니다. 공백을 없애는 목적이라도 프로토콜이나 파일 형식에서 그 공백이 의미 있는지부터 확인합니다.