유닉스에서 캐리지 리턴 제거


답변:


261

내가 당신에게 평균 캐리지 리턴 (가정거야 CR, "\r", 0x0d상기) 이 아니라 단지 맹목적으로 파일 내에서보다 더 라인을 (당신은 내가 아는 모든 문자열의 중간에이를 수있다). CR첫 줄 끝에 만이 테스트 파일을 사용하는 경우 :

$ cat infile
hello
goodbye

$ cat infile | od -c
0000000   h   e   l   l   o  \r  \n   g   o   o   d   b   y   e  \n
0000017

dos2unix 시스템에 설치되어 있으면 갈 수있는 방법입니다.

$ cat infile | dos2unix -U | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

어떤 이유로 든 dos2unix사용할 수없는 경우 다음 sed을 수행하십시오.

$ cat infile | sed 's/\r$//' | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

어떤 이유로 든 sed사용할 수없는 ed경우 복잡한 방법으로 수행 할 수 있습니다.

$ echo ',s/\r\n/\n/
> w !cat
> Q' | ed infile 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

당신이하지 않으면 어떤 당신의 상자에 설치하는 도구를 사용하면 변환 파일을 것보다 더 큰 문제가 있어요 :-)


13
\rGNU sed에서만 작동합니다. 그렇지 않으면 다음과 같이 할 수 있습니다.sed `echo "s/\r//"`
lapo

15
MacO sedecho인식 하지 \r못합니다. 이 경우에만 printf "\r"작동하는 것으로 보입니다.
Steve Powell

30
sed "s/$(printf '\r')\$//"
@steve

7
맥에 대한 수정 문제에 당신은 또한에 문자열 나오지 단일 따옴표를 앞에 수 $: 그래서 같은 sed $'s@\r@@g' |od -c (그러나 당신이 대체 할 경우 \n당신을 탈출해야합니다)
nhed

1
100 % 확신 할 수는 없지만 OS X의 경우 CTRL-V + CTRL-M대신 사용할 수 있는 \r것처럼 보입니다.

240
tr -d '\r' < infile > outfile

tr (1) 참조


4
좋지 않습니다 : 1. 제대로 작동하지 않습니다. 2. \ r도 EOL에서 대체 할 수 없습니다 (원하는 것이거나 아닐 수도 있습니다 ...).
Tomasz Gandor

10
1. 대부분의 유닉스 도구는 그런 식으로 작동하며, 나사를 조이면 여전히 원본이 있기 때문에 물건을 다루는 가장 안전한 방법입니다. 2. 언급 된 질문은 줄 끝을 변환하지 않고 캐리지 리턴을 제거하는 것입니다. 그러나 더 나은 서비스를 제공 할 수있는 다른 답변이 많이 있습니다.
Henrik Gustafsson

1
귀하의 경우 tr지원하지 않습니다 \r탈출을 시도 '\015'아마도 문자 나 '^M'(CTRL-V CTRL-M은 문자 그대로 CTRL-M 문자를 생성합니다 많은 단말기에 많은 포탄을).
tripleee

따라서 원하는 때 어떻게 변경 outfile = infile합니까?
Christopher

3
@donlan, 늦은 응답이지만 일반적으로 다음과 같은 것을 사용합니다 someProg <in >out && mv out in.
paxdiablo

38

오래된 학교:

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns

32

리눅스에서 가장 간단한 방법은 제 생각에는

sed -i 's/\r$//g' <filename>

대체 연산자에 대한 강한 따옴표's/\r//'필수적 입니다. 그것들이 없으면 쉘은 \r이스케이프 + r로 해석 하고 평범하게 r줄이고 소문자를 모두 제거합니다 r. 그렇기 때문에 2009 년 Rob 이 제공 한 답변이 효과가없는 이유 입니다.

/g수정자를 추가하면 \r첫 번째 항목뿐만 아니라 여러 항목 도 제거됩니다.



7

sed -i s/\r// <filename>또는 그런 것; 의 man sed사용과 관련하여 웹에서 볼 수있는 풍부한 정보를 참조하십시오 sed.

지적해야 할 것은 위의 "캐리지 리턴"의 정확한 의미입니다. 단일 제어 문자 "캐리지 리턴"을 실제로 의미하는 경우 위 패턴이 올바른 것입니다. 보다 일반적으로 CRLF (캐리지 리턴 및 줄 바꿈, 즉 줄 바꿈이 Windows에서 구현되는 방식)를 의미하는 경우 \r\n대신 바꾸려고 할 수 있습니다. Linux / Unix의 베어 라인 피드 (개행)는 \n입니다.


작동하지 않는-> sed 's / \ r \ n / = /'countryNew.txt> demo.txt를 사용하려고합니다. "호랑이" "사자"
Suvasis

우리는 당신이 맥에 있다는 것을 의미하기 위해 그것을해야합니까? Darwin sed가 대부분의 Linux 버전과 기본적으로 다른 명령 및 기능 세트를 갖는 것으로 나타났습니다.
jsh

4
참고로, s/\r//OS X에서 캐리지 리턴을 제거하지 않는 r대신 리터럴 문자 를 제거하는 것으로 보입니다 . 왜 그런지 잘 모르겠습니다. 아마도 문자열이 인용되는 방식과 관련이 있습니까? 해결 방법 CTRL-V + CTRL-M으로 대신 사용 \r하는 것이 좋습니다.

6

Vi 사용자 인 경우 다음을 사용하여 파일을 열고 캐리지 리턴을 제거 할 수 있습니다.

:%s/\r//g

또는

:1,$ s/^M//

ctrl-v를 누른 다음 ctrl-m을 눌러 ^ M을 입력해야합니다.


2
좋지 않음 : 파일에 모든 행에 CR이있는 경우 (즉, 올바른 DOS 파일) vim은 filetype = dos로 파일을로드하고 ^M-s를 전혀 표시하지 않습니다 . 이 문제를 해결하는 것은 수많은 키 입력으로 vim이 만들어지는 것은 아닙니다.). 난 그냥 가서 sed -iEOL에서 CR로 제거를 제한하기 위해`-e 's / \ r $ // g' 하겠습니다 .
Tomasz Gandor

6

한 번 더 해결책 ... 항상 하나 더 있기 때문에 :

perl -i -pe 's/\r//' filename

그것은 제 위치에 있고 내가 함께 일한 모든 유닉스 / 리눅스에서 작동하기 때문에 좋습니다.


3

다른 사람이 추천 dos2unix하고 강력 추천합니다. 더 자세한 내용을 제공하고 있습니다.

설치된 경우 다음 단계로 이동하십시오. 아직 설치하지 않은 경우 yum다음과 같이 설치하는 것이 좋습니다 .

yum install dos2unix

그런 다음 다음과 같이 사용할 수 있습니다.

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt

2

dos2unix명령이 없지만 Python 인터프리터 (버전 2.5 이상) 가있는 OS (예 : OS X)를 사용하는 경우이 명령은 다음 명령과 같습니다 dos2unix.

python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))"

이렇게하면 명령 줄에서 명명 된 파일과 파이프 및 리디렉션을 모두 처리 할 수 dos2unix있습니다. 이 행을 ~ / .bashrc 파일 (또는 다른 쉘의 동등한 프로파일 파일)에 추가하는 경우 :

alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\""

... 다음에 로그인하거나 source ~/.bashrc현재 세션에서 실행할 dos2unix때 다른 예제와 같은 방식으로 명령 줄에서 이름 을 사용할 수 있습니다 .


2

여기에 문제가 있습니다.

%0d캐리지 리턴 문자입니다. 유닉스와 호환되도록. 아래 명령을 사용해야합니다.

dos2unix fileName.extension fileName.extension


1

dos 파일을 유닉스 파일로 변환하려면 다음을 시도하십시오.

fromdos 파일


1

UNIX의 경우 ... dos2unix가 UTF-8 파일에서 유니 코드 헤더를 제거했습니다. git bash (Windows)에서 다음 스크립트가 잘 작동하는 것 같습니다. sed를 사용합니다. 행 끝의 캐리지 리턴 만 제거하고 유니 코드 헤더는 유지합니다.

#!/bin/bash

inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"

1

X 환경을 실행 중이고 적절한 편집기 (비주얼 스튜디오 코드)가있는 경우 권장 사항을 따릅니다.

Visual Studio Code : 줄 끝을 표시하는 방법

화면의 오른쪽 아래 모서리로 이동하면 Visual Studio 코드에서 파일 인코딩과 줄 끝 규칙, 파일 다음에 모두 표시됩니다. 간단한 클릭만으로 전환 할 수 있습니다.

리눅스 환경에서 비주얼 코드를 notepad ++ 대신 사용하면됩니다.


또는 파일을 Linux 시스템에 복사하기 전에 Windows 시스템에서 Notepad++의 명령을 사용 Edit / EOL Conversion / Unix (LF)하십시오.
Jesse Chisholm

1

\rUNIX® 시스템에서 제거 :

이 질문에있는 대부분의 기존 솔루션은 GNU에만 해당되며 OS X 또는 BSD에서는 작동하지 않습니다. 아래의 솔루션에서 더 많은 유닉스 시스템에서 작동하고, 어떤 쉘해야 tcshsh아직은 너무, GNU / 리눅스도 작동.

OS X, OpenBSD 및 NetBSD에서 tcsh및 Debian GNU / Linux에서 테스트 되었습니다 bash.


sed:

으로 tcsh는 OS X에 다음 sed코드 조각은 함께 사용할 수 printf도로서, sedecho핸들 \r은 GNU와 같은 특별한 방법을 수행합니다

sed `printf 's/\r$//g'` input > output

tr:

다른 옵션은 tr다음과 같습니다.

tr -d '\r' < input > output

차이 사이 sedtr:

tr입력 파일에서 후행 줄 바꿈이 부족한 것으로 보이지만 sedOS X 및 NetBSD (OpenBSD 또는 GNU / Linux는 아님)에서 입력이 누락 된 경우에도 파일 맨 끝에 후행 줄 바꿈을 삽입합니다. 후행 \r또는 \n파일의 맨 끝에 있습니다.


테스트 :

다음은 printfand를 사용하여 시스템에서 작동하는지 확인하는 데 사용할 수있는 샘플 테스트입니다 hexdump -C. 또는 od -c시스템이없는 경우에도 사용할 수 있습니다 hexdump.

% printf 'a\r\nb\r\nc' | hexdump -C
00000000  61 0d 0a 62 0d 0a 63                              |a..b..c|
00000007
% printf 'a\r\nb\r\nc' | ( sed `printf 's/\r$//g'` /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63 0a                                 |a.b.c.|
00000006
% printf 'a\r\nb\r\nc' | ( tr -d '\r' < /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63                                    |a.b.c|
00000005
% 

0

나는 그것을 위해 파이썬을 사용했다. 여기 내 코드;

end1='/home/.../file1.txt'
end2='/home/.../file2.txt'
with open(end1, "rb") as inf:
     with open(end2, "w") as fixed:
        for line in inf:
            line = line.replace("\n", "")
            line = line.replace("\r", "")
            fixed.write(line)

0

오래된 게시물이지만 최근에 같은 문제가 발생했습니다. / tmp / blah_dir / 안에 모든 파일의 이름을 바 꾸었으므로이 디렉토리의 각 파일 뒤에 "/ r"문자 (파일 끝에 "?"가 표시됨)가 있으므로 스크립트 방식 만 생각하면됩니다.

나는 마지막 파일을 같은 이름으로 저장하고 싶었습니다 (문자없이). sed에서 문제는 다른 것을 언급 해야하는 출력 파일 이름이었습니다 (원하지 않은).

여기에 제안 된 다른 옵션을 시도했지만 (일부 제한으로 인해 dos2unix로 간주되지 않음) 작동하지 않았습니다.

"awk"를 사용해 보았습니다. 마침내 "\ r"을 구분자로 사용하고 첫 번째 부분을 수행했습니다 .

트릭은 :

echo ${filename}|awk -F"\r" '{print $1}'

아래의 스크립트 스 니펫 (/ tmp / blah_dir / 경로에 모든 파일에 후행 문자로 "\ r"이 있음)을 사용하여 문제를 해결했습니다.

cd /tmp/blah_dir/
for i in `ls`
  do
    mv   $i     $(echo $i | awk -F"\r" '{print $1}')
done

참고 : 이 예제는 내가 한 일에 가깝지만 정확하지는 않습니다 (내가 한 일에 대한 더 나은 아이디어를 제공하기 위해 여기에서 언급)


0

이 셸 스크립트를 사용하여 \ r 문자를 제거했습니다. 그것은 solaris와 red-hat에서 작동합니다 :

#!/bin/ksh

LOCALPATH=/Any_PATH

for File in `ls ${LOCALPATH}`
do
   ARCACT=${LOCALPATH}/${File}
   od -bc ${ARCACT}|sed -n 'p;n'|sed 's/015/012/g'|awk '{$1=""; print $0}'|sed 's/ /\\/g'|awk '{printf $0;}'>${ARCACT}.TMP
   printf "`cat ${ARCACT}.TMP`"|sed '/^$/d'>${ARCACT}
   rm ${ARCACT}.TMP
done

exit 0

-1

당신은 단순히 이것을 할 수 있습니다 :

$ echo $(cat input) > output

왜 누군가가 '-1'을 줬는 지 모릅니다. 이것은 완벽하게 좋은 대답입니다 (그리고 나를 위해 일한 유일한 것).
FractalSpace

1
미안, 나였 어 잠깐만, 실제로 '\ r'에서는 작동하지 않습니다!
Viacheslav Rodionov 2016 년

1
@FractalSpace 이것은 끔찍한 아이디어입니다! 파일의 모든 간격을 완전히 잃어 버리고 파일의 모든 내용을 셸에서 해석하도록 남겨 둡니다. 한 줄이 들어있는 파일을보십시오 a * b...
톰 Fenech에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.