줄 끝 유지


111

sed를 실행하여 Windows에서 일부 대체 작업을 수행했는데 자동으로 줄 끝이 Unix (\ n)로 변환된다는 것을 알았습니다. sed에게 Windows 줄 끝 (\ r \ n)을 사용하도록 지시하거나 파일에서 줄 끝을 보존하는 것이 더 나은 옵션이 있습니까?

참고 : 저는 unxutils에서 sed를 사용합니다 : http://unxutils.sourceforge.net/


2
아래 솔루션은 macOS에서 작동하지 않습니다.
William Entriken

나는 심지어 여기까지 도달했지만 여전히 작동하지 않았습니다LC_ALL=C perl -i -e 'binmode $STDIN;undef $/;$_=<>;s|http://911coned.com|https://911coned.com|gm;print' education.html
William

따라서 실제로 위의 명령이 작동하고 git diff프로그램 에서 버그를 발견했습니다 .
William Entriken

1
sed (특별 옵션없이) +
unix2dos를

답변:


143

-bsed에 대한 옵션을 사용하여 파일을 바이너리로 처리 할 수 있습니다 . 이것은 Windows에서 cygwin의 sed 문제를 해결할 것입니다.

예: sed -b 's/foo/bar/'

줄 끝을 일치 시키려면 선택 사항 인 캐리지 리턴을 일치, 캡처 및 복사해야합니다.

예: sed -b 's/foo\(\r\?\)$/bar\1/'

로부터 나오지 man 페이지 :

-b-바이너리

이 옵션은 모든 플랫폼에서 사용할 수 있지만 운영 체제가 텍스트 파일과 이진 파일을 구분하는 경우에만 효과적입니다. MS-DOS, Windows, Cygwin의 경우처럼 이러한 구분이 이루어지면 텍스트 파일은 캐리지 리턴과 줄 바꿈 문자로 구분 된 줄로 구성되며 sed는 끝 CR을 볼 수 없습니다. 이 옵션을 지정하면 sed는 입력 파일을 바이너리 모드로 열므로이 특수 처리를 요청하지 않고 줄 바꿈으로 끝나는 줄을 고려합니다 .`


5
이것은 sed -icygwin에서 작동하지 않지만 (나를 위해) 해결할 수 있습니다. 업데이트 해 주셔서 감사합니다-다른 답변은 잠시 동안이 주제에 대한 마지막 단어였습니다.
harpo

이 옵션은 Mac의 sed에서는 사용할 수 없습니다.
Senthil Kumaran

21
나를 위해 작동합니다 sed -i: 입력하는 방법이 중요합니다. 동안 sed -bised -i -b작업 sed -ib수행 하지 합니다 (을 사용하는 이유에 대한 매뉴얼 페이지를 참조하십시오 : 작업을 b백업 사본에 대한 접미사로를).
Olaf Mandel

2
사용 :sed -bi 's/foo/bar/'
Kunal B.

2
Windows cygwin에서 나를 위해 작동하지 않습니다. sed가 변경 한 라인에서 라인 엔딩은 Unixy입니다. 나머지 줄에는 Windowish 줄 끝이 있습니다. 따라서 내 파일에는 줄 끝이 다른 줄이 섞여 있습니다.
truthadjustr

10

다음 과 같이 기존 스크립트 끝에서 \nfor 를 구독 할 수 \r\n있습니다.

sed 's/foo/bar/;s/$/\r/'

또는 아마도

 sed -e 's/foo/bar/' -e 's/$/\r/'

위의 두 가지 방법 중 어느 것도 작동하지 않는 sed경우 해당 옵션이 있는지 확인하려면 해당 버전의 특정 매뉴얼 페이지 를 참조해야합니다. 의 * nix 버전은 sed그렇게 하라는 지시없이 줄 종결자를 변경 하지 않습니다 .

또 다른 대안은 사용하는 것입니다 cygwin버전 sed있는 이 바람직하지 않은 동작을합니다.


15
cygwin 버전에는 이러한 바람직하지 않은 동작이 있습니다.
harpo

2
파일에 \ n ( 0x0A) 및 \ r \ n ( 0x0D 0x0A)이 모두 포함되어있는 경우이 제안 된 솔루션 (항상 \ r을 다시 주입)은이를 중단합니다.
Vlad

이것은 MSYS2 / MinGW를 사용하여 나를 위해 작동합니다. @SiegeX 감사합니다.
AntumDeluge

6

또는 (cygwin 버전) perl -pe에는이 문제가없는 것 같습니다.


MacOS의 sed에는 -b 옵션이 없으며 원래 질문에서 설명한 것과 유사한 문제가 있습니다. Perl 대안에는이 문제가 없으므로 제안 해 주셔서 감사합니다. sed -i -e 's/<img[^>]*\/>//g' *.xml을 대체는 'N \'로 엔딩 줄 perl -i -p -e 's/<img[^>]*\/>//g' *.xml원래의 라인 엔딩을 유지
Guruniverse

2

-b 스위치와 리디렉션 만 지정하면 Gnuwin이 줄 바꿈 (win-> unix)을 엉망으로 만들 수 있습니다. -i (인라인) 스위치를 사용하면 엉망이됩니다.

예 : sed.exe -b "s / \ xFF \ xFE //"c : \ temp \ in.csv> c : \ temp \ out.csv


1
내 대답에 작업 -i모드가 있는 버전을 참조하십시오 .
Vadzim

2

나는 것으로 나타났습니다 sed-4.4.exe에서 https://github.com/mbuilov/sed-windows 그것은 순수한 승리

  • 기본 모드에서 Windows CRLF 줄 끝을 사용합니다.
  • -b모드 에서 원래 줄 끝을 유지 합니다.
  • 내부 -i모드 에서 올바르게 작동합니다.
  • 같은 -z과 모드를 \0분리 문자 대신 \n하는 때때로 편리 할 수

참조 나오지 옵션 목록포트 나오지 모든 창의 목록을 .

참고 것을 gnuwin32 4.2.1이 나오지 않는 손상 행 끝 에서 -bi모드가없는 -z전혀 모드.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.