맨위로가기

Tr (유닉스)

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

1. 개요

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

더 읽어볼만한 페이지

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

2. 기본 사용법

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

```

tr 'abcd' 'jkmn'

```

위 명령어는 ''a''를 ''j''로, ''b''를 ''k''로, ''c''를 ''m''으로, ''d''를 ''n''으로 바꾼다. 문자 집합은 `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]

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`로 쓸 수 있다.

다음 예는 알파벳을 알파벳 순서로 한 글자 앞의 문자로 모두 치환한다(''a''는 ''z''로).[1]

```

$ echo "ibm 9000" >computer.txt

$ tr a-z za-y
hal 9000

```

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

```

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

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

2. 2. 문자 삭제

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

tr -d '\r'

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

tr -cd '[:alnum:]'

2. 3. 문자 압축

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

```

tr -s '\n'

```

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

2. 4. 문자 집합

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

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

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

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

```

tr -cd '[:alnum:]'

3. 고급 활용

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


  • `-c` 옵션 (보수): 지정된 문자 집합의 여집합(Complement)을 사용한다. 예를 들어, `tr -cd '[:alnum:]'` 명령어는 알파벳과 숫자를 제외한 모든 문자를 제거한다.[1]
  • `-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:]'

```

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

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 유닉스에 도입되었다.[1] GNU coreutils에 포함된 `tr` 버전은 짐 메이어링이 작성했다.[2]

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



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

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

4. 1. POSIX 표준

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

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

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

4. 2. 유니코드 지원

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

4. 3. 운영체제별 구현

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

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

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

5. 기타

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

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

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

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

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

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` 연산자가 있다.[7][8] Tcl의 `string map` 명령어는 문자에서 문자로 매핑하는 `tr`과 달리 문자열을 문자열에 매핑한다는 점에서 더 일반적이다.[9]

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



tr/ぁ-んァ-ン/ァ-ンぁ-ん/;

tr/ゝゞヽヾ/ヽヾゝゞ/;


5. 2. 카이사르 암호 예시

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

```text

$ echo cheer | tr abcdefghijklmnopqrstuvwxyz hijklmnopqrstuvwxyzabcdefg

'''jolly'''

```

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

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

```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|tr abcdefghijklmnopqrstuvwxyz zabcdefghijklmnopqrstuvwxy영어). 사용법에 따라 이전 표기법으로 충분한 경우도 있다. 예를 들어, ROT13tr "[A-M][N-Z][a-m][n-z]" "[N-Z][A-M][n-z][a-m]" 이 되며, 최신 버전에서도 문제없이 작동한다. 이는 대괄호가 두 문자 집합의 같은 위치에 있기 때문에 치환되어도 변하지 않기 때문이며, POSIX의 '''tr'''이 대괄호를 해석하지 않는다는 점은 변함이 없다.

참조

[1] 간행물 A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 http://www.cs.dartmo[...]
[2] 웹사이트 Tr(1): Translate/Delete char - Linux man page https://linux.die.ne[...]
[3] 웹사이트 Native Win32 ports of some GNU utilities http://unxutils.sour[...]
[4] 서적 The OS-9 Guru - 1 : The Facts Galactic Industrial Limited
[5] 문서 MSX-DOS2 Tools User's Manual by ASCII Corporation https://archive.org/[...]
[6] 웹사이트 IBM System i Version 7.2 Programming Qshell https://www.ibm.com/[...] 2020-09-05
[7] 웹사이트 tr (String) - APIdock https://apidock.com/[...] APIdock 2015-08-12
[8] 웹사이트 tr - perldoc.perl.org https://perldoc.perl[...] perldoc.perl.org 2015-08-12
[9] 웹사이트 Tcl Built-In Commands - string manual page https://www.tcl.tk/m[...] 2015-08-12



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com