Linux tr 명령어: 문자 변환 및 처리

LinuxBeginner
지금 연습하기

소개

이 실습에서는 문자 단위로 텍스트를 변환하는 다재다능한 유틸리티인 Linux tr 명령어를 살펴봅니다. "translate"의 약자인 tr 명령어는 대소문자 변환, 특정 문자 제거, 기본적인 데이터 정제 작업 등에 널리 사용됩니다. 이 실습을 마치면 다양한 텍스트 조작 시나리오에서 tr을 능숙하게 활용할 수 있게 될 것입니다. 이 과정은 초보자를 위해 설계되었으므로, Linux 명령어가 생소하더라도 걱정하지 마세요. 각 단계를 차근차근 안내해 드립니다.

이 과정은 단계별 지침을 통해 학습과 실습을 돕는 가이드형 실습입니다. 안내에 따라 각 단계를 완료하며 직접 경험을 쌓아보세요. 통계에 따르면 이 실습은 초급 수준이며, 98%의 완수율과 학습자들로부터 99%의 긍정적인 평가를 받았습니다.

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

이 명령어를 분석해 보겠습니다.

  1. cat ~/project/greeting.txt: 파일의 내용을 읽습니다.
  2. |: 파이프 기호입니다. 왼쪽 명령어의 출력을 오른쪽 명령어의 입력으로 전달합니다.
  3. 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

명령어의 구성을 살펴보겠습니다.

  1. cat ~/project/punctuated.txt: 파일 내용을 읽습니다.
  2. |: 출력을 tr 명령어로 전달합니다.
  3. tr -d '[:punct:]':
    • -d 옵션은 지정된 문자를 삭제 (delete) 하라고 tr에 지시합니다.
    • [:punct:]는 모든 문장 부호를 나타내는 문자 클래스입니다. 문자 클래스는 특정 문자 그룹을 쉽게 지정할 수 있도록 미리 정의된 집합입니다.

이 명령어는 텍스트에서 모든 문장 부호를 제거하고 글자, 숫자, 공백만 남깁니다.

여러 문자 변환하기

이번에는 조금 더 복잡한 변환을 시도해 보겠습니다. 암호화된 텍스트가 담긴 파일을 만들고 tr을 사용하여 이를 해독해 보겠습니다. 이 예제는 tr이 간단한 암호화 및 복호화에 어떻게 사용될 수 있는지 보여줍니다.

먼저 암호화된 텍스트 파일을 생성합니다.

echo "Tijt jt b tfdsfu nfttbhf." > ~/project/encoded.txt

팁: 터미널에 파일 생성 명령어를 복사하여 붙여넣으면 정확하게 파일을 만들 수 있습니다.

이제 이를 해독해 보겠습니다.

cat ~/project/encoded.txt | tr 'b-za-a' 'a-z'

출력 결과는 다음과 같습니다.

This is a secret message.

명령어를 분석해 보겠습니다.

  1. cat ~/project/encoded.txt: 암호화된 파일의 내용을 읽습니다.
  2. |: 출력을 tr 명령어로 전달합니다.
  3. tr 'b-za-a' 'a-z':
    • 첫 번째 집합 'b-za-a'는 다음과 같이 구성됩니다.
      • 'b-z': b 부터 z 까지의 알파벳
      • 'a-a': 알파벳 a
      • 즉, 전체 집합은 b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a 순서입니다.
    • 두 번째 집합 'a-z'는 a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z 순서입니다.
    • 이 설정은 첫 번째 집합의 각 문자를 두 번째 집합의 대응하는 문자로 바꾸는 매핑을 생성합니다.
      • b (첫 번째 집합의 1 번째) → a (두 번째 집합의 1 번째)
      • c (첫 번째 집합의 2 번째) → b (두 번째 집합의 2 번째)
      • ...
      • a (첫 번째 집합의 26 번째) → z (두 번째 집합의 26 번째)
    • 결과적으로 입력된 각 알파벳을 알파벳 순서상 한 칸 뒤로 밀어내는 효과를 줍니다 (카이사르 암호 해독).
    • 주의: tr 명령어는 문자 단위로 변환을 수행하므로 소문자만 영향을 받습니다. 메시지 시작 부분의 대문자 "T"는 첫 번째 집합의 어떤 문자와도 일치하지 않기 때문에 변하지 않고 그대로 유지됩니다.

이러한 방식의 치환은 카이사르 암호라고 불리는 아주 단순한 형태의 암호화입니다. 실제 보안용으로는 적합하지 않지만, 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

명령어를 분석해 보겠습니다.

  1. cat ~/project/log_entry.txt: 로그 파일 내용을 읽습니다.
  2. |: 출력을 tr 명령어로 전달합니다.
  3. 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.

명령어를 분석해 보겠습니다.

  1. cat ~/project/spaced.txt: 추가 공백이 있는 파일 내용을 읽습니다.
  2. |: 출력을 tr 명령어로 전달합니다.
  3. tr -s ' ':
    • -s 옵션은 지정된 문자가 연속해서 나타날 경우 이를 하나로 압축 (squeeze) 합니다.
    • ' '는 압축하고자 하는 대상이 공백 문자임을 지정합니다.

이 명령어는 형식이 잘못된 데이터를 다루거나 텍스트 파일 내의 화이트스페이스를 표준화해야 할 때 특히 유용합니다.

요약

이 실습에서는 Linux 의 다재다능한 tr 명령어를 살펴보았습니다. 우리가 배운 내용은 다음과 같습니다.

  1. 텍스트 대소문자 변환 방법
  2. 특정 문자 삭제 방법
  3. 여러 문자를 일괄적으로 치환하는 방법
  4. 문자 클래스 활용법
  5. 연속된 중복 문자 압축 방법

tr 명령어는 텍스트 조작을 위한 강력한 도구입니다. 이번 실습에서 자세히 다루지는 않았지만 다음과 같은 추가 옵션도 있습니다.

  • -c: 첫 번째 문자열에 정의된 집합의 보집합을 대상으로 작업 수행 (즉, 포함되지 않은 문자들 선택)
  • -t: 첫 번째 문자열의 길이를 두 번째 문자열의 길이에 맞춰 자르기

더욱 고도화된 텍스트 처리 작업이 필요하다면, 향후 실습에서 sedawk와 같은 다른 명령어들도 탐구해 보시기 바랍니다.

참고 자료