[bash: sed] 리눅스에서 윈도우 텍스트 파일의 CR(캐리지 리턴) 제거 리눅스 bash script

윈도우에서 만들어진 텍스트 파일의 일부분을 리눅스쪽에서 가져다가 작업하면서 발생했던 문제다. grep을 이용해서 파일의 특정한 부분을 가져온 후에 다른 내용과 조합해서 출력해야 하는 상황이었다. 대략 아래의 예시와 같다.

# from_windows.txt 파일 내용중 처음 출현한 시간(HH:MM:SS 형식) 추출 및 출력
time_val=`cat from_windows.txt | grep "[012][0-9]:[0-5][0-9]:[0-5][0-9]" | head -1`
echo "$time_val 발견!"
 발견!55

추출한 값을 변수 time_val에 저장한 후에 echo 명령으로 위의 예시와 같이 출력을 했는데, 변수값 뒤에 출력되어야 할 문자열이 맨 앞으로 오는 문제가 발생. 이렇게 되는 이유는 윈도우와 리눅스의 줄바꿈 문자가 다르기 때문이다. 리눅스는 LF(\n), 윈도우는 CRLF(\r\n) 이렇게 다르기 때문에 윈도우에서 만들어진 파일에 대해서 문자열을 추출했을 경우 커서를 맨 앞으로 보내는 CR이 남아 있을 수 있다.

파일 전체를 리눅스 형식으로 바꾸려면 tofrodos 패키지에 포함된 fromdos를 이용하면 되지만(이전 게시물을 참고하자. 여기로), 일부분만  추출해서 변수에 할당하고 작업해야 할 경우에는 sed를 이용해서 CR만 제거해 주면 되겠다. 아래와 같은 형태로 해결. (sed를 이용한 문자열 대체의 가장 기본적인 내용은 여기로)

time_val=`cat from_windows.txt | grep "[012][0-9]:[0-5][0-9]:[0-5][0-9]" | head -1 | sed 's/\r//'`
echo "$time_val 발견!"

00:23:55 발견!

만약 파일 전체에 대해 CR을 제거하고 싶은데 tofrodos 패키지를 설치하지 않았다면 sed를 이용해서 간단하게 변환해 줄 수 있겠다.

# from_windows.txt 파일 전체에 대해 CR 제거후 from_windows.modified.txt 파일에 저장
sed 's/\r//g' from_windows.txt > from_windows.modified.txt

변환한 내용을 다른 파일이 아니라 현재 파일에 그대로 적용하고 싶다면 -i 옵션을 사용하면 된다.

# from_windows.txt 파일 전체에 대해 CR 제거후 저장(덮어쓰기)
sed -i 's/\r//g' from_windows.txt

sed 활용에 대한 다른 게시물들은 여기로.



덧글

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

Google Analytics


B-Side


adsense(w160_h600)2

통계 위젯 (화이트)

7581061
5759
1288631

ad_widget_2