파일을 변수에 로드하고 있는데 문제는 파일이 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
\r
for tr
또는 inside 로 지정할 수 있는 캐리지 리턴(CR)입니다 $'…'
. \n
줄 바꿈 문자(LF)를 지정합니다. 즉, ^J
Unix 줄 끝은 LF이고 Windows 줄 구분 기호는 두 문자 시퀀스 CR-LF이므로 Linux 또는 macOS와 같은 Unix 시스템에서 표시되는 Windows 텍스트 파일은 다음과 같습니다. ^M
마지막 개행 문자가 누락된 각 줄(마지막 줄 제외)의 끝에 있습니다 .
tr
with를 사용하여 파일에서 캐리지 리턴을 제거할 수 있습니다.
tr -d '\r' <somefile.txt >somefile.txt.new && mv somefile.txt.new somefile.txt
또는 더 간단하게 dos2unix
.
파일 수정을 방지하려면 파일을 읽을 때 각 줄을 확인하고 줄 끝의 CR을 제거하면 됩니다. 예를 들어 탭으로 구분된 값을 구문 분석하는 데 이를 사용하는 경우 read
마지막 필드 끝에 있는 CR을 제거하세요. 매개변수 확장은 ${VAR%$'\r'}
후행 CR을 뺀 값 또는 VAR
CR로 끝나지 않은 경우 발생하는 값을 생성합니다.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
(동시에 설치됨)에 따라 다른 특수 문자도 번역합니다.