파일이 아닌 변수에서만 개행 문자(^M)를 제거하는 방법

파일이 아닌 변수에서만 개행 문자(^M)를 제거하는 방법

파일을 변수에 로드하고 있는데 문제는 파일이 Windows에서 형식화되었기 때문에 ^M줄 바꿈 대신 줄 바꿈이 표시된다는 것입니다.

변수에 있는 값을 어떻게 수정합니까? VI에서 소스 코드를 수정할 수 있다는 것을 알고 있지만(그나저나 저는 OS X를 사용하고 있습니다) 원본 파일을 수정할 수 없고 읽기만 할 수 있으므로 ^M변수에서 제거해야 합니다.

내가 알기로는 \n은 와 다르기 ^M때문에 tr명령이 작동하지 않습니다.

편집하다

질문이 명확하지 않은 것 같습니다.

한 줄에 2개의 값을 탭으로 구분하고 각 줄 끝에 ^M을 사용하여 파일을 한 줄씩 분석했는데 다음과 같습니다.

value1    value2^M
value3    value4^M
value5    value6^M
value7    value8^M

내 작업 흐름은 매우 간단하고 간단합니다. 위에 표시된 내용이 포함된 txt 파일로, 개별 필드를 반복하고 각 행에 대한 값을 가져옵니다. 두 번째 값을 인쇄하면 ^M이 있으므로 이를 제거하고 싶습니다.

while IFS=$'\t' read -r -a line
do
    Type1="${line[0]}"
    Type2="${line[1]}"
done < $TXTFILE

이는 Type1을 인쇄하면 괜찮지만 Type2 변수에 ^M이 포함되어 있음을 의미합니다. 사용했지만 tr작동하지 않았습니다. sed변수의 마지막 문자 제거를 사용했지만 작동하지 않았습니다. 이것이 내 질문을 명확하게 해주기를 바랍니다. 감사해요

답변1

^M\rfor tr또는 inside 로 지정할 수 있는 캐리지 리턴(CR)입니다 $'…'. \n줄 바꿈 문자(LF)를 지정합니다. 즉, ^JUnix 줄 끝은 LF이고 Windows 줄 구분 기호는 두 문자 시퀀스 CR-LF이므로 Linux 또는 macOS와 같은 Unix 시스템에서 표시되는 Windows 텍스트 파일은 다음과 같습니다. ^M마지막 개행 문자가 누락된 각 줄(마지막 줄 제외)의 끝에 있습니다 .

trwith를 사용하여 파일에서 캐리지 리턴을 제거할 수 있습니다.

tr -d '\r' <somefile.txt >somefile.txt.new && mv somefile.txt.new somefile.txt

또는 더 간단하게 dos2unix.

파일 수정을 방지하려면 파일을 읽을 때 각 줄을 확인하고 줄 끝의 CR을 제거하면 됩니다. 예를 들어 탭으로 구분된 값을 구문 분석하는 데 이를 사용하는 경우 read마지막 필드 끝에 있는 CR을 제거하세요. 매개변수 확장은 ${VAR%$'\r'}후행 CR을 뺀 값 또는 VARCR로 끝나지 않은 경우 발생하는 값을 생성합니다.VAR

while IFS=$'\t' read -r -a line
do
    line[$((${#line[@]}-1))]="${line[$((${#line[@]}-1))]%$'\r'}"
    Type1="${line[0]}"
    Type2="${line[1]}"
done < "$TXTFILE"

답변2

이것은 스크립트를 수정하는 가장 쉬운 방법입니다. 읽기 명령의 내부 필드 구분 기호로 "캐리지 리턴"을 추가하기만 하면 됩니다.

그리고 IFS=$'\t\아르 자형'-r -a 줄 읽기
하다
  유형 1 = "${row[0]}"
  2="${row[1]}"를 입력하세요.
완료 < $TXTFILE

답변3

사용(짧은 문자열의 경우):

${var//$'\015'}

예:

$ var=$'This is a test of a CR (\r) character'
$ echo "${var//$'\r'}"
This is a test of a CR () character

더 긴 문자열의 경우 sed 또는 awk가 필요할 수 있습니다.

답변4

CR+LF 줄 끝 외에 다른 내용 표시자가 없는 "DOS" 파일의 내용을 변환하는 보다 일반적으로 유용한 방법입니다(Linux의 LF에만 해당).

Ubuntu의 경우 처음이자 유일한 경우 다음을 수행하십시오.

sudo apt 설치 dos2unix

od출력을 확인하려면 아래 표시된 대로 사용하세요.

$ dos2unix < $TXTFILE od -t x1z -w17 |
0000000 76 61 6c 75 65 31 20 20 20 20 76 61 6c 75 65 32 0a > 값 1 값 2. <
0000021 76 61 6c 75 65 33 20 20 20 20 76 61 6c 75 65 34 0a >값 3 값 4.<
0000042 76 61 6c 75 65 35 20 20 20 20 76 61 6c 75 65 36 0a >값 5 값 6.<
0000063 76 61 6c 75 65 37 20 20 20 20 76 61 6c 75 65 38 0a > 값 7 값 8. <
0000104

$ 고양이 $TXTFILE od -t x1z -w18 |
0000000 76 61 6c 75 65 31 20 20 20 20 76 61 6c 75 65 32 0d 0a >값 1 값 2..<
0000022 76 61 6c 75 65 33 20 20 20 20 76 61 6c 75 65 34 0d 0a >값 3 값 4..<
0000044 76 61 6c 75 65 35 20 20 20 20 76 61 6c 75 65 36 0d 0a >값 5 값 6..<
0000066 76 61 6c 75 65 37 20 20 20 20 76 61 6c 75 65 38 0d 0a >값 7 값 8..<
0000110

이는 줄 끝뿐만 아니라 매개변수 dos2unix또는 그에 상응하는 항목 unix2dos(동시에 설치됨)에 따라 다른 특수 문자도 번역합니다.

관련 정보