Tr (유닉스)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

tr은 문자를 변환, 삭제, 또는 압축하는 데 사용되는 유닉스 명령어이다. 이 명령어는 문자 치환, 삭제, 압축 기능을 제공하며, 문자 집합을 지정하여 다양한 방식으로 텍스트를 처리한다. tr은 두 개의 문자 집합을 인수로 받아 첫 번째 집합의 문자를 두 번째 집합의 해당 문자로 대체하며, -d 옵션을 통해 특정 문자를 삭제하거나, -s 옵션을 사용하여 연속된 문자를 단일 문자로 압축할 수 있다. 또한, 고급 활용을 위해 -c 옵션을 사용하여 지정된 문자 집합의 여집합을 대상으로 작업할 수 있으며, 파이프라인을 통해 다른 명령어와 연계하여 사용할 수도 있다. tr은 다양한 운영체제에서 구현되어 있으며, 루비와 펄과 같은 다른 프로그래밍 언어에도 유사한 기능이 존재한다.

Tr (유닉스) - [IT 관련 정보]에 관한 문서
설명
종류유닉스 텍스트 포매팅 유틸리티
일반 정보
이름tr
제작자더글러스 매킬로이 (AT&T 벨 연구소)
개발자다양한 오픈 소스 및 상용 개발자들
발표일1973년 11월
프로그래밍 언어C
운영 체제유닉스
유닉스 계열
Plan 9
Inferno
OS-9
MSX-DOS
IBM i
플랫폼크로스 플랫폼
장르명령
라이선스coreutils: GPLv3+
Plan 9: MIT 라이선스
웹사이트해당사항 없음
📚 더 읽어볼만한 페이지
  • 유닉스 텍스트 처리 유틸리티 - Apropos
    apropos는 사용자가 입력한 키워드와 관련된 매뉴얼 페이지를 검색하는 명령어로, man -k의 래퍼로 작동하며 대소문자를 구분하지 않고 매뉴얼 페이지의 이름 섹션에서 키워드를 검색하여 관련 페이지 목록을 반환한다.
  • 유닉스 텍스트 처리 유틸리티 - Cut (유닉스)
    `cut`은 텍스트 파일이나 표준 입력에서 특정 부분을 추출하는 유닉스 명령어이며, 바이트, 문자, 필드 단위 추출을 지원하고 구분자를 지정하여 필드를 나눌 수 있다.
  • 유닉스 SUS2008 유틸리티 - AWK
    AWK는 1977년에 개발된 텍스트 처리 및 프로그래밍 언어로, 유닉스 환경에서 텍스트 처리를 위해 설계되었으며 정규 표현식 처리 기능을 통해 텍스트 분석, 데이터 추출, 보고서 생성 등 다양한 작업을 수행한다.
  • 유닉스 SUS2008 유틸리티 - 로케일
    로케일은 소프트웨어 국제화 및 지역화에서 사용자 문화적 배경에 맞춰 사용 환경을 조정하는 설정으로, 표시 언어, 숫자/날짜 형식, 문자 분류, 통화 형식 등을 포함한다.

2. 기본 사용법

`tr`은 표준 입력에서 바이트 스트림을 읽어 표준 출력으로 결과를 내보내는 유틸리티이다. 명령줄 인수로 두 개의 문자 집합(일반적으로 같은 길이)을 받아서, 첫 번째 집합의 문자를 두 번째 집합의 해당 요소로 대체한다.

```
tr 'abcd' 'jkmn'
```

위 명령어는 aj로, bk로, cm으로, dn으로 바꾼다. 문자 집합은 `a-d`와 같이 문자 범위를 사용하여 줄여 쓸 수 있다.

POSIX을 준수하는 `tr` 버전에서는 문자 범위가 로케일의 정렬 순서에 따라 달라지므로, 다른 로케일에서 실행될 수 있는 스크립트에서는 문자 범위를 피하고 `[:alpha:]`와 같은 POSIX 문자 집합을 사용하는 것이 안전하다.

`-s` 플래그를 사용하면 출력에서 연속되는 동일한 문자를 하나로 압축할 수 있다. 예를 들어,

```
tr -s '\n'
```

위 명령어는 하나 이상의 연속된 개행 문자를 하나의 개행 문자로 바꾼다.

`-d` 플래그를 지정하면 입력에서 지정된 문자 집합의 모든 문자를 삭제한다. 다음은 캐리지 리턴 문자를 제거하는 명령어이다.

```
tr -d '\r'
```

`-c` 플래그는 첫 번째 문자 집합의 보수를 나타낸다. 예를 들어,

```
tr -cd '[:alnum:]'
```

위 명령어는 알파벳과 숫자를 제외한 모든 문자를 제거한다.

`tr`에서 "\n"을 "\r\n"으로 치환하는 특수한 경우가 있다. 그러나 모든 `tr`이 `-A` 옵션을 지원하는 것은 아니며, 이 역슬래시를 해석하므로 작은따옴표 대신 큰따옴표를 사용할 수 없다. \n, \12, ^J는 각각 이스케이프 문자, ASCII 8진수, 캐럿 표기를 사용한 줄 바꿈 문자를 나타내며, \r, \15, ^M은 캐리지 리턴 문자이다. 더 자세한 내용은 줄 바꿈 문자 문서를 참조하라.

Ruby와 Perl에도 비슷한 역할을 하는 `tr` 연산자(메서드)가 있다.

2.1. 문자 치환

`tr` 유틸리티는 표준 입력에서 받은 문자열을 변경하여 표준 출력으로 내보낸다. 명령줄 인수로 두 개의 문자 집합을 받는데, 첫 번째 집합의 문자를 두 번째 집합의 해당 문자로 바꾼다.

예를 들어, 다음 명령어는

```
tr 'abcd' 'jkmn'
```

`a`를 `j`로, `b`를 `k`로, `c`를 `m`으로, `d`를 `n`으로 바꾼다.

문자 범위를 사용하여 문자 집합을 축약할 수 있다. 위의 예는 다음과 같이 쓸 수 있다.

```
tr 'a-d' 'jkmn'
```

POSIX를 준수하는 `tr` 버전에서는 로케일의 정렬 순서에 따라 문자 범위가 달라질 수 있으므로, 스크립트에서는 문자 범위를 피하고 `[:alpha:]`와 같은 POSIX 문자 집합을 사용하는 것이 안전하다.

`s` 플래그를 사용하면 출력에서 연속되는 동일한 문자를 하나로 압축한다. 예를 들어,

```
tr -s '\n'
```

는 하나 이상의 연속된 개행 문자를 하나의 개행 문자로 바꾼다.

`d` 플래그를 사용하면 입력에서 지정된 문자 집합의 모든 문자를 삭제한다. 예를 들어, 다음 명령어는 캐리지 리턴 문자를 제거한다.

```
tr -d '\r'
```

`c` 플래그는 첫 번째 문자 집합의 보수(complement)를 나타낸다. 예를 들어,

```
tr -cd '[:alnum:]'
```

는 알파벳과 숫자를 제외한 모든 문자를 제거한다.

다음은 알파벳을 알파벳 순서로 7자 뒤의 문자로 치환하는 예시이다(카이사르 암호의 변형).

```
$ echo cheer | tr abcdefghijklmnopqrstuvwxyz hijklmnopqrstuvwxyzabcdefg
jolly
```

POSIX를 준수한다면, `tr a-z h-za-g`로 쓸 수 있다.

다음 예는 알파벳을 알파벳 순서로 한 글자 앞의 문자로 모두 치환한다(az로).

```
$ echo "ibm 9000" >computer.txt
$ tr a-z za-y hal 9000
```

POSIX와 호환되지 않는 이전 `tr`에서는 문자의 범위를 지정하려면 대괄호로 묶어야 하며, 이 해석하는 것을 방지하기 위해 인용 부호로 묶어야 한다.

```
$ tr "[a-z]" "z[a-y]" ```

Ruby와 Perl에도 비슷한 역할을 하는 `tr` 연산자(메서드)가 있다.

2.2. 문자 삭제

`tr` 유틸리티에 `-d` 플래그를 지정하면 입력에서 지정된 문자 집합의 모든 문자를 삭제한다. 이 경우, 단일 문자 집합 인수만 사용된다. 예를 들어, 다음 명령은 캐리지 리턴 문자를 제거한다.

tr -d '\r'

`c` 플래그는 첫 번째 문자 집합의 보수를 나타낸다. 예를 들어, 다음 명령은 알파벳이나 숫자가 아닌 모든 문자를 제거한다.

tr -cd '[:alnum:]'

2.3. 문자 압축

`tr`의 `-s` 옵션은 출력에서 연속적으로 나타나는 동일한 문자를 단일 문자로 압축한다. 예를 들어, 다음 명령어는

```
tr -s '\n'
```

하나 이상의 연속된 개행 문자를 단일 개행 문자로 바꾼다.

2.4. 문자 집합

`tr` 유틸리티는 문자 집합을 기반으로 문자를 치환하거나 삭제하는 기능을 제공한다. 문자 집합은 일반적으로 두 개가 주어지며, 첫 번째 집합의 문자들이 두 번째 집합의 해당 위치에 있는 문자로 대체된다.

문자 집합은 문자 범위를 사용하여 간략하게 표현할 수 있다. 예를 들어, `'a-d'`는 `'abcd'`와 동일하게 동작한다. 하지만, POSIX를 준수하는 `tr` 버전에서는 문자 범위가 로케일의 정렬 순서에 따라 달라질 수 있으므로, 스크립트의 이식성을 위해 `'[:alpha:]'`와 같은 POSIX 문자 클래스를 사용하는 것이 더 안전하다.

`tr`에서 POSIX 이전 버전에서는 문자의 범위를 지정하려면 대괄호로 묶어야 했으며 (예: `"[a-z]"`), 이 해석하는 것을 방지하기 위해 인용 부호로 묶어야 했다. 하지만, POSIX `tr`에서는 대괄호를 해석하지 않으므로 주의해야 한다.

다음은 POSIX 문자 클래스를 사용하여 모든 비 알파벳 숫자 문자를 제거하는 예시이다.

```
tr -cd '[:alnum:]'

3. 고급 활용

`tr` 명령어는 고급 옵션을 통해 다양한 문자열 변환을 수행할 수 있다.

* `-c` 옵션 (보수): 지정된 문자 집합의 여집합(Complement)을 사용한다. 예를 들어, `tr -cd '[:alnum:]'` 명령어는 알파벳과 숫자를 제외한 모든 문자를 제거한다.
* `-s` 옵션 (연속 압축): 출력에서 연속되는 동일한 문자를 하나의 문자로 압축한다. 예를 들어, `tr -s '\n'` 명령어는 하나 이상의 연속된 개행 문자(`\n`)를 하나의 개행 문자로 바꾼다.
* `-d` 옵션 (삭제): 입력에서 지정된 문자 집합의 모든 문자를 삭제한다. 예를 들어, `tr -d '\r'` 명령어는 캐리지 리턴 문자(`\r`)를 제거한다.

`tr` 명령어는 다른 명령어와 파이프라인을 통해 함께 사용될 때 유용하다.

예시:

1. "cheer" 문자열에서 각 알파벳을 알파벳 순서로 7자 뒤의 문자로 치환 ( 카이사르 암호의 변형):

```bash
$ echo cheer | tr abcdefghijklmnopqrstuvwxyz hijklmnopqrstuvwxyzabcdefg
jolly
```

`echo` 명령어로 "cheer" 문자열을 `tr` 명령어의 표준 입력으로 전달하고, `tr` 명령어는 지정된 규칙에 따라 문자를 치환하여 "jolly"를 표준 출력으로 출력한다.
2. `tr`을 사용하여 파일 내용 변경:

```bash
$ echo "ibm 9000" > computer.txt
$ tr a-z za-y < computer.txt
hal 9000
```

`echo` 명령으로 "ibm 9000" 문자열을 `computer.txt` 파일에 저장한다. 그 후 쉘의 리다이렉션을 통해 `computer.txt`파일을 `tr`의 입력으로 사용하여, `tr` 명령어를 통해 `computer.txt` 파일의 내용을 읽어 각 알파벳을 바로 앞의 문자로 바꾼다. (예: 'a'는 'z'로, 'b'는 'a'로). 결과적으로 "hal 9000"이 출력된다.

3.1. 보수(`-c`) 옵션

`tr`에서 `-c` 옵션을 사용하면 지정된 문자 집합의 여집합(Complement)을 사용하게 된다. 예를 들어,
```
tr -cd '[:alnum:]'
```
위 명령어는 알파벳과 숫자를 제외한 모든 문자를 제거한다.

3.2. 조합 활용

`tr` 명령어의 여러 옵션을 조합하여 복잡한 문자열 변환을 수행할 수 있다.

* `s` 플래그는 출력에서 연속되는 동일한 문자를 하나의 문자로 압축한다. 예를 들어, 다음 명령어는 하나 이상의 연속된 개행 문자(`\n`)를 하나의 개행 문자로 바꾼다.

```
tr -s '\n'
```

* `d` 플래그는 입력에서 지정된 문자 집합의 모든 문자를 삭제한다. 예를 들어, 다음 명령어는 캐리지 리턴 문자(`\r`)를 제거한다.

```
tr -d '\r'
```

* `c` 플래그는 첫 번째 문자 집합의 여집합을 나타낸다. 예를 들어, 다음 명령어는 알파벳과 숫자를 제외한 모든 문자를 제거한다.

```
tr -cd '[:alnum:]'

3.3. 파이프라인 연계

`tr` 명령어는 다른 명령어와 파이프라인을 통해 함께 사용될 때 유용하다.

예를 들어, "cheer"라는 문자열에서 각 알파벳을 알파벳 순서로 7자 뒤의 문자로 치환하는 경우가 있다. (예: 'a'는 'h'로 바뀜, 카이사르 암호의 변형)

```bash
$ echo cheer | tr abcdefghijklmnopqrstuvwxyz hijklmnopqrstuvwxyzabcdefg
jolly
```

`echo` 명령어를 사용하여 "cheer" 문자열을 `tr` 명령어의 표준 입력으로 전달하고, `tr` 명령어는 지정된 규칙에 따라 문자를 치환하여 "jolly"를 표준 출력으로 출력한다.

다음은 `tr`을 사용하여 파일 내용을 변경하는 예시이다.

```bash
$ echo "ibm 9000" > computer.txt
$ tr a-z za-y < computer.txt
hal 9000
```

`echo` 명령으로 "ibm 9000" 문자열을 `computer.txt` 파일에 저장한다. 그 후 쉘의 리다이렉션을 통해 `computer.txt`파일을 `tr`의 입력으로 사용하여, `tr` 명령어를 통해 `computer.txt` 파일의 내용을 읽어 각 알파벳을 바로 앞의 문자로 바꾼다. (예: 'a'는 'z'로, 'b'는 'a'로). 결과적으로 "hal 9000"이 출력된다.

4. 구현 및 호환성

`tr` 명령어는 더글러스 맥클로이가 처음 작성했으며, 버전 4 유닉스에 도입되었다. GNU coreutils에 포함된 `tr` 버전은 짐 메이어링이 작성했다.

이 명령어는 다음과 같은 다양한 운영 체제에서 사용할 수 있다.

* 마이크로소프트 윈도우: GNU 유닉스 유틸리티를 네이티브 Win32로 포팅한 UnxUtils를 통해 제공된다.
* OS-9 셸
* ASCII의 MSX-DOS 버전 2용 MSX-DOS2 툴
* IBM i 운영 체제

대부분의 `tr` 버전은 단일 바이트 문자만 처리하며 유니코드를 지원하지 않지만, Heirloom Toolchest 구현은 기본적인 유니코드 지원을 제공한다.

루비와 에도 `tr`과 유사하게 작동하는 내부 연산자가 있다. Tcl의 `string map` 명령어는 문자열을 문자열에 매핑한다는 점에서 `tr`보다 더 일반적이다.

4.1. POSIX 표준

POSIX를 준수하는 `tr` 버전에서 문자 범위로 표현되는 집합은 로케일의 정렬 순서에 따라 달라진다. 따라서 작성된 로케일과 다른 로케일에서 실행될 수 있는 스크립트에서는 문자 범위를 피하는 것이 더 안전하다. 범위는 종종 `[:alpha:]`와 같은 POSIX 문자 집합으로 대체될 수 있다.

예를 들어 알파벳을 알파벳 순서로 7자 뒤의 문자로 모두 치환할 때(ah로, 카이사르 암호의 변형) POSIX를 준수한다면 `a-z h-za-g`와 같이 쓸 수 있다.

POSIX와 호환되지 않는 이전 `tr`에서는 문자의 범위를 지정하려면 대괄호로 묶어야 하며, 이 해석하는 것을 방지하기 위해 인용 부호로 묶어야 한다. 어느 버전이 호출되는지 알 수 없는 경우에는 범위 지정을 하지 않고 모든 문자를 나열해야 한다.

4.2. 유니코드 지원

GNU `tr` 및 클래식 유닉스 `tr`을 포함한 대부분의 `tr` 버전은 단일 바이트 문자만 처리하며 유니코드를 준수하지 않는다. 예외적으로 기본적인 유니코드 지원을 제공하는 Heirloom Toolchest 구현이 있다.

4.3. 운영체제별 구현

GNU coreutils에 포함된 `tr` 버전은 짐 메이어링이 작성했다. 이 명령어는 GNU 유닉스 유틸리티를 Win32로 이식한 UnxUtils 패키지를 통해 마이크로소프트 윈도우에서도 사용할 수 있다. OS-9 셸에서도 사용 가능하다.

`tr` 명령어는 ASCII의 MSX-DOS 버전 2용 MSX-DOS2 툴에도 포함되어 있으며, IBM i 운영 체제로도 이식되었다.

GNU `tr`과 클래식 유닉스 `tr`을 포함한 대부분의 `tr` 버전은 단일 바이트 문자만 처리하고 유니코드를 지원하지 않는다. 예외적으로 Heirloom Toolchest 구현은 기본적인 유니코드 지원을 제공한다.

5. 기타

루비와 에도 비슷하게 작동하는 내부 `tr` 연산자가 있다. Tcl의 `string map` 명령어는 문자에서 문자로 매핑하는 `tr`과 달리 문자열을 문자열에 매핑한다는 점에서 더 일반적이다.

루비와 펄에도 `tr` 연산자(메서드)가 있으며, 비슷한 역할을 한다. 예를 들어, 일본어를 처리할 수 있는 Perl을 사용하면 히라가나와 가타카나를 교환하는 스크립트를 작성할 수 있다. (단, "ヴ", "ヵ", "ヶ" 제외.)

다음은 알파벳을 알파벳 순서로 7자 뒤의 문자로 모두 치환하는 예시이다(ah로, 카이사르 암호의 변형).

POSIX를 준수하는 tr을 사용한다면, 마지막 두 단어는 a-z영어 h-za-g영어로 쓸 수 있다.

다음은 알파벳을 알파벳 순서로 한 글자 앞의 문자로 모두 치환하는 예시이다(az로).

POSIX와 호환되지 않는 이전 tr에서는 문자의 범위를 지정하려면 대괄호로 묶어야 하며, 이 해석하는 것을 방지하기 위해 인용 부호로 묶어야 했다.

어느 버전이 호출되는지 알 수 없는 경우, 범위 지정을 하지 않고 모든 문자를 나열해야 하는 경우도 있다. ROT13의 경우 tr "[A-M][N-Z][a-m][n-z]" "[N-Z][A-M][n-z][a-m]" 과 같이 사용할 수 있는데, 이는 대괄호가 두 문자 집합의 같은 위치에 있기 때문에 치환되어도 변하지 않으며, POSIX의 tr이 대괄호를 해석하지 않는다는 점은 변함이 없기 때문이다.

5.1. 다른 프로그래밍 언어와의 비교

루비와 에도 비슷하게 작동하는 내부 `tr` 연산자가 있다. Tcl의 `string map` 명령어는 문자에서 문자로 매핑하는 `tr`과 달리 문자열을 문자열에 매핑한다는 점에서 더 일반적이다.

루비와 펄에도 `tr` 연산자(메서드)가 있으며, 비슷한 역할을 한다. 예를 들어, 일본어를 처리할 수 있는 Perl을 사용하면 다음 Perl 스크립트는 히라가나와 가타카나를 교환한다. (단, "ヴ", "ヵ", "ヶ" 제외.)


tr/ぁ-んァ-ン/ァ-ンぁ-ん/;
tr/ゝゞヽヾ/ヽヾゝゞ/;

5.2. 카이사르 암호 예시

다음은 알파벳을 알파벳 순서로 7자 뒤의 문자로 모두 치환하는 예시이다(ah로, 카이사르 암호의 변형).

```text
$ echo cheer | tr abcdefghijklmnopqrstuvwxyz hijklmnopqrstuvwxyzabcdefg
jolly
```

사용하고 있는 tr이 만약 POSIX를 준수한다면, 마지막 두 단어는 단순히 a-z영어 h-za-g영어로 쓸 수 있다.

다음은 알파벳을 알파벳 순서로 한 글자 앞의 문자로 모두 치환하는 예시이다(az로).

```text
$ echo "ibm 9000" >computer.txt
$ tr a-z za-y hal 9000
```

POSIX와 호환되지 않는 이전 tr에서는 문자의 범위를 지정하려면 대괄호로 묶어야 하며, 이 해석하는 것을 방지하기 위해 인용 부호로 묶어야 한다.

```text
$ tr "[a-z]" "z[a-y]" ```

어느 버전이 호출되는지 알 수 없는 경우, 이 예에서는 범위 지정을 하지 않고 모든 문자를 나열해야 한다(tr abcdefghijklmnopqrstuvwxyz zabcdefghijklmnopqrstuvwxy영어). 사용법에 따라 이전 표기법으로 충분한 경우도 있다. 예를 들어, ROT13tr "[A-M][N-Z][a-m][n-z]" "[N-Z][A-M][n-z][a-m]" 이 되며, 최신 버전에서도 문제없이 작동한다. 이는 대괄호가 두 문자 집합의 같은 위치에 있기 때문에 치환되어도 변하지 않기 때문이며, POSIX의 tr이 대괄호를 해석하지 않는다는 점은 변함이 없다.