\r
Unix의 파일에서 모든 캐리지 리턴을 제거하는 가장 간단한 방법은 무엇입니까 ?
\r
Unix의 파일에서 모든 캐리지 리턴을 제거하는 가장 간단한 방법은 무엇입니까 ?
답변:
내가 당신에게 평균 캐리지 리턴 (가정거야 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
당신이하지 않으면 어떤 당신의 상자에 설치하는 도구를 사용하면 변환 파일을 것보다 더 큰 문제가 있어요 :-)
\r
GNU sed에서만 작동합니다. 그렇지 않으면 다음과 같이 할 수 있습니다.sed `echo "s/\r//"`
sed
도 echo
인식 하지 \r
못합니다. 이 경우에만 printf "\r"
작동하는 것으로 보입니다.
sed "s/$(printf '\r')\$//"
$
: 그래서 같은 sed $'s@\r@@g' |od -c
(그러나 당신이 대체 할 경우 \n
당신을 탈출해야합니다)
tr -d '\r' < infile > outfile
tr (1) 참조
tr
지원하지 않습니다 \r
탈출을 시도 '\015'
아마도 문자 나 '^M'
(CTRL-V CTRL-M은 문자 그대로 CTRL-M 문자를 생성합니다 많은 단말기에 많은 포탄을).
outfile = infile
합니까?
someProg <in >out && mv out in
.
sed -i s/\r// <filename>
또는 그런 것; 의 man sed
사용과 관련하여 웹에서 볼 수있는 풍부한 정보를 참조하십시오 sed
.
지적해야 할 것은 위의 "캐리지 리턴"의 정확한 의미입니다. 단일 제어 문자 "캐리지 리턴"을 실제로 의미하는 경우 위 패턴이 올바른 것입니다. 보다 일반적으로 CRLF (캐리지 리턴 및 줄 바꿈, 즉 줄 바꿈이 Windows에서 구현되는 방식)를 의미하는 경우 \r\n
대신 바꾸려고 할 수 있습니다. Linux / Unix의 베어 라인 피드 (개행)는 \n
입니다.
Vi 사용자 인 경우 다음을 사용하여 파일을 열고 캐리지 리턴을 제거 할 수 있습니다.
:%s/\r//g
또는
:1,$ s/^M//
ctrl-v를 누른 다음 ctrl-m을 눌러 ^ M을 입력해야합니다.
^M
-s를 전혀 표시하지 않습니다 . 이 문제를 해결하는 것은 수많은 키 입력으로 vim이 만들어지는 것은 아닙니다.). 난 그냥 가서 sed -i
EOL에서 CR로 제거를 제한하기 위해`-e 's / \ r $ // g' 하겠습니다 .
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
때 다른 예제와 같은 방식으로 명령 줄에서 이름 을 사용할 수 있습니다 .
여기에 문제가 있습니다.
%0d
캐리지 리턴 문자입니다. 유닉스와 호환되도록. 아래 명령을 사용해야합니다.
dos2unix fileName.extension fileName.extension
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 코드에서 파일 인코딩과 줄 끝 규칙, 파일 다음에 모두 표시됩니다. 간단한 클릭만으로 전환 할 수 있습니다.
리눅스 환경에서 비주얼 코드를 notepad ++ 대신 사용하면됩니다.
Notepad++
의 명령을 사용 Edit / EOL Conversion / Unix (LF)
하십시오.
\r
UNIX® 시스템에서 제거 :이 질문에있는 대부분의 기존 솔루션은 GNU에만 해당되며 OS X 또는 BSD에서는 작동하지 않습니다. 아래의 솔루션에서 더 많은 유닉스 시스템에서 작동하고, 어떤 쉘해야 tcsh
에 sh
아직은 너무, GNU / 리눅스도 작동.
OS X, OpenBSD 및 NetBSD에서 tcsh
및 Debian GNU / Linux에서 테스트 되었습니다 bash
.
sed
:으로 tcsh
는 OS X에 다음 sed
코드 조각은 함께 사용할 수 printf
도로서, sed
도 echo
핸들 \r
은 GNU와 같은 특별한 방법을 수행합니다
sed `printf 's/\r$//g'` input > output
tr
:다른 옵션은 tr
다음과 같습니다.
tr -d '\r' < input > output
sed
및 tr
:tr
입력 파일에서 후행 줄 바꿈이 부족한 것으로 보이지만 sed
OS X 및 NetBSD (OpenBSD 또는 GNU / Linux는 아님)에서 입력이 누락 된 경우에도 파일 맨 끝에 후행 줄 바꿈을 삽입합니다. 후행 \r
또는 \n
파일의 맨 끝에 있습니다.
다음은 printf
and를 사용하여 시스템에서 작동하는지 확인하는 데 사용할 수있는 샘플 테스트입니다 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
%
오래된 게시물이지만 최근에 같은 문제가 발생했습니다. / 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
참고 : 이 예제는 내가 한 일에 가깝지만 정확하지는 않습니다 (내가 한 일에 대한 더 나은 아이디어를 제공하기 위해 여기에서 언급)
이 셸 스크립트를 사용하여 \ 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
당신은 단순히 이것을 할 수 있습니다 :
$ echo $(cat input) > output
a * b
...