소개
이번 실습에서는 텍스트를 문자 단위로 변환하는 다재다능한 유틸리티인 Linux의 tr 명령어를 살펴봅니다. "translate(변환)"의 약자인 tr 명령어는 대소문자 변환, 특정 문자 제거, 기본적인 데이터 정리와 같은 작업에 널리 사용됩니다. 이 실습을 마치면 다양한 텍스트 조작 시나리오에서 tr을 능숙하게 사용할 수 있게 될 것입니다. 초보자를 위해 설계되었으므로 Linux 명령어가 처음이더라도 걱정하지 마세요. 각 단계를 차근차근 안내해 드리겠습니다.
tr 명령어 기초 이해하기
먼저 tr 명령어의 기본 구문을 이해해 보겠습니다.
tr [OPTION]... SET1 [SET2]
tr 명령어는 표준 입력(stdin)으로부터 텍스트를 읽어 들여, 지정된 옵션과 문자 집합에 따라 변환한 뒤 표준 출력(stdout)으로 결과를 내보냅니다.
간단한 예제부터 시작해 보겠습니다. 기본적인 인사말이 담긴 greeting.txt 파일을 생성한 다음, tr을 사용하여 모든 소문자를 대문자로 변환해 보겠습니다.
먼저 파일을 생성합니다:
echo "hello, world" > ~/project/greeting.txt
팁: 파일 생성 명령어를 터미널에 복사하여 붙여넣으면 정확하게 파일을 생성할 수 있습니다.
이 명령어는 프로젝트 디렉토리(~/project/)에 "hello, world"라는 내용을 담은 greeting.txt 파일을 새로 만듭니다.
이제 tr을 사용하여 모든 소문자를 대문자로 변환해 보겠습니다:
cat ~/project/greeting.txt | tr 'a-z' 'A-Z'
다음과 같은 출력을 확인할 수 있습니다:
HELLO, WORLD
명령어를 분석해 보겠습니다:
cat ~/project/greeting.txt: 파일의 내용을 읽어옵니다.|: 파이프 기호입니다. 왼쪽 명령어의 출력을 받아 오른쪽 명령어의 입력으로 전달합니다.tr 'a-z' 'A-Z':tr명령어입니다. 첫 번째 집합('a-z', 모든 소문자를 의미)의 각 문자를 두 번째 집합('A-Z', 모든 대문자를 의미)의 대응하는 문자로 변환합니다.
이 명령어는 원본 파일을 수정하지 않는다는 점에 유의하세요. 변환된 텍스트를 저장하려면 출력을 새 파일로 리다이렉션해야 합니다.
tr로 문자 삭제하기
tr 명령어는 입력에서 특정 문자를 삭제할 수도 있습니다. 이는 원치 않는 문자를 제거하여 텍스트를 정리해야 할 때 매우 유용합니다. 문장 부호가 포함된 파일을 생성한 뒤 이를 제거해 보겠습니다.
먼저 문장 부호가 포함된 파일을 생성합니다:
echo "Hello, World! How are you?" > ~/project/punctuated.txt
팁: 파일 생성 명령어를 터미널에 복사하여 붙여넣으면 정확하게 파일을 생성할 수 있습니다.
이제 tr을 사용하여 모든 문장 부호를 제거해 보겠습니다:
cat ~/project/punctuated.txt | tr -d '[:punct:]'
결과는 다음과 같습니다:
Hello World How are you
명령어를 분석해 보겠습니다:
cat ~/project/punctuated.txt: 파일의 내용을 읽어옵니다.|: 출력을tr명령어로 전달합니다.tr -d '[:punct:]':-d옵션은tr에게 지정된 문자를 삭제하라고 지시합니다.[:punct:]는 모든 문장 부호를 나타내는 문자 클래스입니다. 문자 클래스는 문자 그룹을 쉽게 지정할 수 있도록 미리 정의된 문자 집합입니다.
이 명령어는 텍스트에서 모든 문장 부호를 제거하고 문자, 숫자, 공백만 남깁니다.
여러 문자 변환하기
이제 좀 더 복잡한 변환을 살펴보겠습니다. 인코딩된 텍스트가 포함된 파일을 생성하고 tr을 사용하여 디코딩해 보겠습니다. 이 예제는 tr이 간단한 암호화 및 복호화에 어떻게 사용될 수 있는지 보여줍니다.
먼저 인코딩된 텍스트가 담긴 파일을 생성합니다:
echo "Uijt jt b tfdsfu nfttbhf." > ~/project/encoded.txt
팁: 파일 생성 명령어를 터미널에 복사하여 붙여넣으면 정확하게 파일을 생성할 수 있습니다.
이제 디코딩해 보겠습니다:
cat ~/project/encoded.txt | tr 'b-zaB-ZA' 'a-zA-Z'
결과는 다음과 같습니다:
This is a secret message.
명령어를 분석해 보겠습니다:
cat ~/project/encoded.txt: 인코딩된 파일의 내용을 읽어옵니다.|: 출력을tr명령어로 전달합니다.tr 'b-zaB-ZA' 'a-zA-Z':- 첫 번째 집합
b-zaB-ZA는 두 개의 시프트된 알파벳을 결합한 것입니다:b-za: b부터 z까지의 소문자 뒤에 a가 옴B-ZA: B부터 Z까지의 대문자 뒤에 A가 옴
- 이들은 각각 한 자리씩 뒤로 밀려야 하는 모든 문자를 포함합니다.
- 두 번째 집합
a-zA-Z는 a부터 z까지의 소문자와 A부터 Z까지의 대문자입니다. - 이를 통해 첫 번째 집합의 각 문자가 두 번째 집합의 대응하는 문자로 교체되는 매핑이 생성됩니다:
- b (첫 번째 집합의 1번째) → a (두 번째 집합의 1번째)
- c (첫 번째 집합의 2번째) → b (두 번째 집합의 2번째)
- ...
- a (첫 번째 집합의 26번째) → z (두 번째 집합의 26번째)
- B (첫 번째 집합의 27번째) → A (두 번째 집합의 27번째)
- ...
- A (첫 번째 집합의 52번째) → Z (두 번째 집합의 52번째)
- 이는 입력된 각 문자를 알파벳 순서상 한 자리씩 앞으로 당겨 소문자와 대문자 모두를 올바르게 디코딩합니다.
- 첫 번째 집합
이러한 치환 방식은 카이사르 암호(Caesar cipher)라고 불리는 매우 간단한 암호화 형태입니다. 실제 환경에서 사용하기에는 보안이 취약하지만, tr을 사용하여 문자 단위 치환을 수행하는 좋은 예시입니다.
tr에서 문자 클래스 사용하기
tr 명령어는 미리 정의된 문자 집합인 다양한 문자 클래스를 지원합니다. 이는 더 복잡한 텍스트 변환을 수행할 때 매우 유용합니다. 실무적인 시나리오에서 이를 활용해 보겠습니다.
먼저 혼합된 내용이 담긴 파일을 생성합니다:
echo "User123 logged in at 09:45 AM on 2023-08-15" > ~/project/log_entry.txt
팁: 파일 생성 명령어를 터미널에 복사하여 붙여넣으면 정확하게 파일을 생성할 수 있습니다.
이제 이 로그 항목에서 숫자만 추출해 보겠습니다:
cat ~/project/log_entry.txt | tr -cd '[:digit:]'
결과는 다음과 같습니다:
12309452023815
명령어를 분석해 보겠습니다:
cat ~/project/log_entry.txt: 로그 파일의 내용을 읽어옵니다.|: 출력을tr명령어로 전달합니다.tr -cd '[:digit:]':-c옵션은 집합을 보완(complement)합니다(즉, "이 집합에 포함되지 않은"을 의미).-d옵션은 지정된 문자를 삭제합니다.[:digit:]는 모든 숫자(0-9)를 나타내는 문자 클래스입니다.- 따라서
-cd '[:digit:]'는 "숫자가 아닌 모든 문자를 삭제하라"는 의미가 됩니다.
이 명령어는 혼합된 텍스트에서 숫자 데이터만 추출할 때 유용하며, 로그 분석이나 데이터 정리 작업에 큰 도움이 됩니다.
tr로 반복 문자 압축하기
tr 명령어는 반복되는 문자를 하나로 "압축(squeeze)"할 수도 있습니다. 이는 불필요한 반복이 포함된 데이터를 정리할 때 유용합니다. 반복되는 문자가 포함된 파일을 생성한 뒤 정리해 보겠습니다.
먼저 반복되는 공백이 포함된 파일을 생성합니다:
echo "This is a test with extra spaces." > ~/project/spaced.txt
팁: 파일 생성 명령어를 터미널에 복사하여 붙여넣으면 정확하게 파일을 생성할 수 있습니다.
이제 tr을 사용하여 반복되는 공백을 압축해 보겠습니다:
cat ~/project/spaced.txt | tr -s ' '
결과는 다음과 같습니다:
This is a test with extra spaces.
명령어를 분석해 보겠습니다:
cat ~/project/spaced.txt: 공백이 많은 파일의 내용을 읽어옵니다.|: 출력을tr명령어로 전달합니다.tr -s ' ':-s옵션은 지정된 문자의 반복을 하나의 문자로 압축합니다.' '는 공백 문자를 압축 대상으로 지정합니다.
이 명령어는 형식이 잘못된 데이터를 다루거나 텍스트 파일의 공백을 정규화해야 할 때 특히 유용합니다.
요약
이번 실습에서는 Linux의 다재다능한 tr 명령어를 살펴보았습니다. 다음 내용을 배웠습니다:
- 텍스트 대소문자 변환
- 특정 문자 삭제
- 여러 문자 변환
- 문자 클래스 사용
- 반복 문자 압축
tr 명령어는 텍스트 조작을 위한 강력한 도구입니다. 자세히 다루지 않은 추가 옵션은 다음과 같습니다:
-c: string1에 포함되지 않은 모든 문자에 대해 작업을 수행(보완)-t: string1을 string2의 길이만큼 자름
더 고급 텍스트 처리 작업이 필요하다면 향후 실습에서 sed나 awk와 같은 명령어를 학습해 보시기 바랍니다.



