문제

가장 간단한 방법은 무엇입 제거하는 모든 캐리지 리턴 \r 파일에서 유닉스?

도움이 되었습니까?

해결책

나는 당신이 캐리지 반환을 의미한다고 가정 할 것입니다 (Cr, "\r", 0x0d) 에서 파일 내에서 맹목적으로 맹목적으로 라인이 아닌 줄 (내가 아는 모든 것을 위해 문자열의 중간에있을 수 있음). 이 테스트 파일을 a로 사용합니다 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

당신이 없다면 어느 상자에 설치된 도구 중 파일을 변환하는 것보다 더 큰 문제가 있습니다 .-)

다른 팁

tr -d '\r' < infile > outfile

보다 Tr (1)

오래된 학교:

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns

유틸리티가 있습니다 dos2unix 그것은 많은 시스템에 존재하며 대부분 쉽게 설치할 수 있습니다.

Linux에서 가장 간단한 방법은 겸손한 견해로는

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

그만큼 강한 인용문 대체 연산자 주변 's/\r//' ~이다 필수적인. 그들 없이는 껍질이 해석 할 것입니다 \r 탈출+r로서 평원으로 줄인다 r, 모든 소문자를 제거하십시오 r. 그렇기 때문에 2009 년 위의 답변이 작동하지 않습니다.

그리고 추가 /g 수정자는 여러 배도를 보장합니다 \r 첫 번째 것뿐만 아니라 제거됩니다.

sed -i s/\r// <filename> 또는 SOMESUCH; 보다 man sed 또는 사용과 관련하여 웹에서 사용할 수있는 풍부한 정보 sed.

지적해야 할 한 가지는 위에서 "캐리지 리턴"의 정확한 의미입니다. 단일 제어 문자 "캐리지 리턴"을 의미한다면 위의 패턴이 정확합니다. 보다 일반적으로 CRLF (캐리지 리턴 및 라인 피드, 이는 선 피드가 Windows에서 구현되는 방법)를 의미한다면, 아마도 교체하고 싶을 것입니다. \r\n 대신에. Linux/Unix의 베어 라인 피드 (Newline)는 \n.

VI 사용자 인 경우 파일을 열고 다음과 같이 캐리지 리턴을 제거 할 수 있습니다.

:%s/\r//g

또는 함께

:1,$ s/^M//

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

한 번 더 솔루션 ... 항상 하나 더 있기 때문입니다.

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

제자리에 있고 내가 함께 일한 Unix/Linux의 모든 맛에서 작동하기 때문에 좋습니다.

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

설치되면 다음 단계로 이동하십시오. 아직 설치되지 않으면 설치하는 것이 좋습니다. yum 처럼:

yum install dos2unix

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

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt

여기가 있습니다.

%0d 캐리지 리턴 문자입니다. Unix와 호환성을 제공합니다. 아래 명령을 사용해야합니다.

dos2unix fileName.extension fileName.extension

dos 파일을 Unix 파일로 변환하려면 이것을 시도하십시오.

Fromdos 파일

는 경우 OS 를 사용하여(OS X)는 없 dos2unix 명령하지만 않는 파이썬(버전 2.5+),이 명령어에 해당하는 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 이름에서 명령 라인에서와 동일한 방식으로 다른 예입니다.

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"

X 환경을 운영하고 있으며 적절한 편집기 (Visual Studio Code)가있는 경우 추천을 따릅니다.

비주얼 스튜디오 코드 : 라인 엔딩을 보여주는 방법

화면의 오른쪽 하단 코너로 이동하면 Visual Studio Code는 파일 인코딩과 라인 컨벤션의 끝과 파일을 모두 보여줍니다. 간단한 클릭만으로 전환 할 수 있습니다.

Linux 환경에서 Notepad ++를 대체하는 것으로 시각적 코드를 사용하면 설정이 설정됩니다.

나는 그것을 위해 Python을 사용했습니다. 여기 내 코드;

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)

오래된 게시물이지만 최근에는 같은 문제가 발생했습니다. 이 디렉토리의 각 파일에 "/r"트레일 링 문자 (파일 끝에 "?"표시)가있는 것처럼 모든 파일이 내부/tmp/blah_dir/로 이름을 바꾸는 모든 파일이 있었기 때문에 스크립트 방식으로 만 생각할 수있었습니다.

동일한 이름으로 최종 파일을 저장하고 싶었습니다 (어떤 문자도 뒤로 인해). SED를 사용하면 문제가 다른 것을 언급해야했던 출력 파일 이름이었습니다 (내가 원하지 않는).

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

나는 " r"을 구분기로 사용하고 첫 번째 부분을 취한 곳에서 일했던 "awk"와 함께 시도했습니다.:

트릭은 :

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

아래 스크립트 스 니펫 아래에 사용했습니다 (모든 파일이있는 곳에서는 Path/TMP/Blah_dir/에서 트레일 링 캐릭터로 " r"이있는 곳).

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

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

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

$ echo $(cat input) > output
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top