문자 하나씩 다루는 가벼운 도구
tr은 줄이나 단어가 아니라 개별 문자를 대상으로 작동해. stdin을 읽어 문자를 바꾸거나 지운 뒤 stdout으로 내보내. 정규식이나 필드 개념 없이 두 문자 집합의 대응만 처리해.
네 가지 기본 동작
tr 'a-z' 'A-Z': 첫 문자 집합을 두 번째 집합에 일대일로 대응해.tr -d 'aeiou': 지정한 모음을 모두 지워.tr -s '\n': 연속된 줄바꿈을 하나로 줄여.tr -c 'a-zA-Z' '_': 영문자에 속하지 않는 문자를 밑줄로 바꿔.
미리 정의된 문자 범주
[:upper:], [:lower:], [:digit:], [:space:], [:punct:] 같은 범주를 사용할 수 있어. tr -d '[:punct:]'는 구두점을 지우고, tr '[:upper:]' '[:lower:]'는 현재 로케일 규칙에 따라 대문자를 소문자로 바꿔.
문자열 치환에는 맞지 않아
tr 'foo' 'bar'는 단어 foo를 bar로 바꾸지 않아. 문자 위치에 따라 f를 b로, o를 뒤쪽 문자에 대응할 뿐이야. 문자열이나 정규식 단위의 치환은 sed나 프로그래밍 언어의 텍스트 API를 사용해.
자주 쓰는 예
- Windows 줄바꿈의 CR 제거:
tr -d '\r' < in.txt > out.txt - 탭을 공백으로 변경:
tr '\t' ' ' - 영문자를 대문자로 변경:
echo 'hello' | tr a-z A-Z - 연속 공백을 하나로 축소:
tr -s '[:space:]' ' '
바이트 정리와 Unicode 처리를 나눠
CR처럼 범위가 분명한 ASCII 바이트를 제거할 때는 tr이 단순해. 하지만 한글, emoji, 결합 문자는 여러 바이트나 코드 포인트로 표현될 수 있으므로 Unicode를 이해하는 도구로 처리해야 해. 화면에 한 글자로 보인다는 사실만으로 tr의 문자 한 칸과 같다고 가정하지 마.
모든 공백을 줄이기 전에 구조를 확인해
tr -s '[:space:]' ' '는 줄바꿈과 탭도 공백으로 바꿔 레코드 경계를 없앨 수 있어. 줄 구조를 버려도 되는 입력인지 먼저 정하고, 원본을 보존한 채 결과를 검증해.