[bash: tr, sed] txt 파일에서 여러줄로 된 항목을 한줄로 바꾸기 - 2 리눅스 bash script

예전에 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
...

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



핑백

  • 반달가면 : [bash: sed] 16진수값(hex) 대체하기 2017-11-14 22:57:16 #

    ... 때문에 줄바꿈 자체는 작업 대상에서 제외되는 것이다. 만약 줄바꿈 자체를 다른 것으로 대체하려면 tr을 사용해야 된다. (tr에 대한 내용은 이전 게시물을 참고하자. 여기로) ... more

  • 반달가면 : 리눅스에서 긴 문자열에 대한 베이스64 인코딩 관련 유의점 2018-02-20 21:55:37 #

    ... 책은 간단하다. tr을 이용해서 줄바꿈을 공백으로 바꾼 후에, sed를 이용해서 바뀐 부분('/ ')을 제거하면 된다. tr과 sed의 조합은 이전 게시물을 참고하자. 여기로 # 긴 문자열에 대한 베이스64 인코딩. 출력을 한줄로 echo "Hello. This is John speaking. May I speak to Jane pl ... more

  • 반달가면 : [bash: grep] 파일 안에 섞인 바이너리(binary) 데이터 제거 2018-04-20 20:46:03 #

    ... 의미이다. 문자열 중간에 바이너리 데이터가 있을 경우 grep의 -o 옵션에 따라 줄바뀜이 발생하므로, 임시 파일에 저장된 결과를 다시 한줄로 바꾸기 위해 tr 명령에서 -d 옵션으로으로 줄바꿈(\n)을 제거. echo "$cur_line" | grep... 명령의 결과에 유효한 문자열 출력이 없을 경우 임시 파일에 이전 임시파일의 ... more

덧글

댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.

Google Analytics


B-Side


adsense(w160_h600)2

통계 위젯 (화이트)

208711
4378
1636334

ad_widget_2