반달가면 이글루에서 백업 - http://bahndal.egloos.com/599415
윈도우에서 만들어진 텍스트 파일의 일부분을 리눅스쪽에서 가져다가 작업하면서 발생했던 문제다. 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
'bash script' 카테고리의 다른 글
[bash: if] if 조건문에서 띄어쓰기에 유의 (0) | 2023.08.10 |
---|---|
[bash: xargs] 공백이 포함된 출력 결과를 다음 명령어의 인자로 사용 (0) | 2023.08.10 |
[bash: awk] 2개의 파일에 있는 자료 종합하기 (0) | 2023.08.08 |
[bash: grep] 바이너리 파일에서 문자열 검색하기 (0) | 2023.08.08 |
[bash: awk] 특정 위치(field)에 대한 정규표현식 문자열 검색 (0) | 2023.08.08 |