bash script2023. 4. 13. 16:30

 

이글루스 블로그에서 백업 - http://bahndal.egloos.com/547759

 

예전에 sed 명령과 for 반복문을 이용해서 여러줄로 된 항목을 한줄로 바꾸는 방법을 써 둔 적이 있는데, 그보다 좀 더 우아한 방법을 찾아냈다. (어쨌든 이전에 적어놓은 방법은 여기로)

우선 tr 명령의 기본적인 사용법을 잠깐 살펴 보자. 특정 캐럭터 집합을 다른 캐럭터 집합으로 대체하는 기능을 제공한다. 아래의 예시를 보면 금방 감을 잡을 수 있다.

# 문자 'a'를 'f'로 변경
echo "abc,def" | tr "a" "f"
fbc,def

# 알파벳 소문자를 모두 삭제(-d 옵션)
echo "abc,def,ghi" | tr -d "[a-z]"
,,

# 쉼표를 줄바꿈(\n)으로 변경
echo "abc,def,ghi" | tr "," "\n"
abc
def
ghi

이전 게시물에서 사용한 것과 동일한 예시를 가지고 좀 더 우아하게 작업을 해 보자. 전화번호부 파일의 내용이 아래와 같은 경우다.

cat my_file.txt
name: john
phone: 010-123-4556

name: jane
phone: 010-345-1234
...

이제 위와 같은 형태를 띤 my_file.txt 파일의 내용을 이름[탭]전화번호 형태로 바꾸는 과정을 보자. 우선 tr 명령으로 줄바꿈을 탭으로 바꿀 수 있다.

# 줄바꿈(\n)을 탭(\t)으로 변경
cat my_file.txt | tr "\n" "\t"
name: john  phone: 010-123-4556    name: jane ...

각 항목의 시작이 문자열 'name:'이므로, '[탭]name:' 부분을 '[줄바꿈]name:' 형태로 바꾸면 된다. 이것은 sed 명령으로 해결.

# 각 항목별로 줄바꿈
cat my_file.txt | tr "\n" "\t" | sed 's/\tname:/\nname:/g'
name: john  phone: 010-12304556
name: jane  phone: 010-345-1234
...

단 한줄의 명령어 조합으로 우아하게 해결되었다.

 

728x90
Posted by 반달가면