tr(translate) 명령어는 Linux에서 표준 입력(standard input)으로부터 텍스트를 읽어 들여, 지정된 방식대로 변환한 뒤 표준 출력(standard output)으로 내보내는 도구입니다. 이 글에서는 tr 명령어가 무엇인지, 어떤 상황에서 그리고 어떻게 사용하는지 예제와 함께 자세히 살펴봅니다.
tr 명령어 기본 문법
tr 명령어를 사용할 때의 기본 문법은 다음과 같습니다.
tr OPTIONS SET1 [SET2]
각 구성 요소를 살펴보면 다음과 같습니다.
- OPTIONS: 아래 표에 정리된 옵션 목록을 지정합니다.
- SET1의 문자는 SET2에서 같은 위치에 있는 문자로 치환됩니다.
- SET은 선택 사항입니다. 일부 옵션은 SET 없이도 변환 작업을 수행할 수 있으므로, 두 SET이 모두 필요한 것은 아닙니다.
- 처리할 텍스트가 명령어에 직접 포함되지 않는다는 점에 유의하세요. 텍스트는 파이프(pipe) 또는 리디렉션(redirection)을 통해 표준 입력으로 전달해야 합니다. 자세한 내용은 아래 예제에서 확인할 수 있습니다.
주요 옵션(OPTIONS)
| 옵션 | 설명 |
|---|---|
| -c | SET1의 여집합(complement)을 사용합니다. |
| -d | SET1에 해당하는 문자를 삭제합니다(치환하지 않음). |
| -s | 마지막으로 지정한 SET에 나열된 문자가 연속해서 반복될 경우, 하나의 문자로 압축합니다. |
| -t | 먼저 SET1을 SET2의 길이에 맞게 잘라냅니다(truncate). |
특수 문자 표기 시퀀스
SET 안에서 줄바꿈이나 탭 같은 특수 문자를 다루려면 아래 시퀀스를 사용할 수 있습니다.
| 시퀀스 | 의미 |
|---|---|
| \NNN | 8진수 값 NNN(1~3자리)에 해당하는 문자 |
| \\ | 백슬래시(\) |
| \b | 백스페이스 |
| \n | 줄바꿈(new line) |
| \r | 캐리지 리턴(return) |
| \t | 수평 탭(horizontal tab) |
| [:alnum:] | 모든 영문자와 숫자 |
| [:alpha:] | 모든 영문자 |
| [:blank:] | 모든 수평 공백 문자 |
| [:digit:] | 모든 숫자 |
| [:lower:] | 모든 소문자 |
| [:space:] | 모든 수평·수직 공백 문자 |
| [:upper:] | 모든 대문자 |
위에는 자주 쓰이는 옵션과 시퀀스만 정리했습니다(실제로는 더 많은 항목이 있습니다). 전체 옵션 목록은 아래 명령어로 열 수 있는 사용자 매뉴얼에서 확인할 수 있습니다.
man tr
tr 명령어 사용 예제
다음은 tr 명령어의 대표적인 활용 예제입니다. 이 예제들은 조합하거나 응용하여 원하는 결과를 얻을 수 있습니다.
문자 삭제하기
아래 예제는 문자열에서 지정한 문자를 제거합니다. echo 명령어의 출력이 파이프(|)를 통해 tr 명령어로 전달됩니다.
tr 명령어는 반드시 파이핑 또는 리디렉션을 통해 표준 입력으로 텍스트를 전달받아야 한다는 점을 기억하세요.
echo "axbxcxdx" | tr -d 'x'
-d 옵션은 echo 명령어의 출력에서 문자 x를 모두 삭제하도록 tr에 지시합니다. 실행 결과는 다음과 같습니다.
abcd
소문자를 대문자로 변환하기
아래 예제는 [:lower:]와 [:upper:] 시퀀스를 이용해 모든 소문자를 대문자로 바꿉니다.
echo "aBcDeFg" | tr '[:lower:]' '[:upper:]'
실행 결과:
ABCDEFG
문자 치환하기
tr 명령어는 문자열 내의 문자를 치환할 때 가장 널리 사용됩니다. 예를 들어 공백을 하이픈(-)으로 바꾸는 경우입니다.
echo "frogs and fish" | tr '[:blank:]' '-'
실행 결과:
frogs-and-fish
이 예제에서는 두 개의 SET이 사용되었습니다. 첫 번째 SET은 공백·탭 같은 공백 문자([:blank:])를, 두 번째 SET은 하이픈을 담고 있으므로 공백이 하이픈으로 치환됩니다(SET2가 SET1을 대체).
웹사이트에 파일을 업로드할 때 파일명에 공백이 포함되지 않도록 처리해야 하는 상황 등에서 특히 유용하게 활용할 수 있습니다.
여러 문자 동시에 치환하기
앞선 예제에서는 각 SET에 문자가 하나씩만 있었지만, 여러 문자를 지정하면 한 번에 여러 개를 치환할 수 있습니다.
echo "frogs and fish" | tr 'sf' 'SF'
실행 결과:
FrogS and FiSh
첫 번째 SET의 각 문자가 두 번째 SET에서 같은 위치에 있는 문자로 바뀐 것을 확인할 수 있습니다.
반복 문자 제거하기
아래 예제는 텍스트에서 불필요하게 반복되는 공백을 제거합니다.
echo 'Absolutely spaced out' | tr -s '[:space:]'
실행 결과:
Absolutely spaced out
-s 옵션과 [:space:] 식별자를 함께 사용하여 연속으로 반복되는 공백을 찾아 하나로 압축했습니다.