텍스트 파일에서 줄 끝을 찾는 방법은 무엇입니까?


304

bash에서 무언가를 사용하여 해석되지 않고 인쇄 된 파일의 줄 끝을 표시하려고합니다. 이 파일은 처리를 위해 Linux 시스템에서 읽고있는 SSIS / SQL Server의 덤프입니다.

  • 내 모든 스위치가 있습니까 vi, less, more, 등?

  • 줄 끝을 보는 것 외에도 줄 끝의 유형이 ( CRLF또는 LF) 인지 알아야합니다 . 어떻게 알 수 있습니까?


1
일반적인 팁 : 어떤 * nix / cygwin 명령을 사용할 수 있는지 알고 있다면 맨 페이지를보고 필요한 기능을 제공 할 수있는 스위치를 검색 할 수 있습니다. 예, man less.
David Rivers

답변:


421

file유틸리티를 사용하여 줄 끝 유형을 표시 할 수 있습니다 .

유닉스 :

$ file testfile1.txt
testfile.txt: ASCII text

"DOS":

$ file testfile2.txt
testfile2.txt: ASCII text, with CRLF line terminators

"DOS"를 Unix로 변환하려면 :

$ dos2unix testfile2.txt

유닉스에서 "DOS"로 변환하기 :

$ unix2dos testfile1.txt

이미 변환 된 파일을 변환해도 아무런 효과가 없으므로 일반적인 고지 사항이 항상 적용되지만 맹목적으로 실행하는 것이 안전합니다 (즉, 먼저 형식을 테스트하지 않고).


9
이들은 지금 때때로 (우분투 10.4의 경우입니다) "fromdos"와 "일하러"각각 명명 된
제스 채드윅

3
명시 적으로 설치 네,하지만 경우에만 : @JessChadwick tofrodos로 패키지를 sudo apt-get install tofrodos실행할해야 할 것처럼 - sudo apt-get install dos2unix얻을 dos2unix하고 unix2dos.
mklement0

Actully DOS2UNIX이 모든 일을 할 수 없어, 나는 생각 stackoverflow.com/questions/23828554/dos2unix-doesnt-convert-m이 가장 좋은 대답을 제공합니다
나단

@nathan : 무엇에 dos2unix실패합니까? 해당 질문의 OP는 문제를 모호하게 설명합니다.
추후 공지가있을 때까지 일시 중지되었습니다.

dos2unix 명령 전후의 @DennisWilliamson 파일 명령은 xxx.c C 소스, ASCII 텍스트, CR, LF 행 종결자가있는 출력을 얻었습니다. 나는이 c 파일에 xxxxxxx를 좋아하는 줄 중간에 ^ M이 있음을 발견했습니다 ^ M xxxxxxx
nathan

127

에서 vi...

:set list 줄 끝을 볼 수 있습니다.

:set nolist 정상으로 돌아갑니다.

나는 당신이 \n또는 \r\nin을 볼 수 없다고 생각하지만 vi, 어떤 줄 끝을 가지고 있는지 유추하기 위해 어떤 유형의 파일 (UNIX, DOS 등)을 볼 수 있습니다 ...

:set ff

또는에서 bash당신이 사용 od -t c <filename>하거나 od -c <filename>수익을 표시합니다.


26
불행히도 vi가 특정 문자를 보여줄 수는 없다고 생각합니다. \ n 또는 \ r \ n을 표시한다고 생각하는 od -c <filename>을 사용해보십시오.
Ryan Berger

3
"가치있는 것"범주에서 grep --regex = "^ M"을 발행하여 Dos 스타일 CRLF를 grep 할 수 있습니다. 여기서 ^ M은 CTRL + V CTRL + M입니다. sed 명령으로 대체하여 제거 할 수 있습니다. 이것은 본질적으로 dos2unix와 동일합니다
cowboydan

11
vim에서 : 파일의 줄 끝이 있다고 생각하는 vim 또는 vim을 :set fileformat보고 합니다.로 변경할 수 있습니다 . unixdos:set fileformat=unix
Victor Zamanian 2016 년

5
vi / vim을 시작할 때 -b 플래그를 사용한 다음 : set list를 사용하여 CR (^ M) 및 LF ($) 끝을보십시오.
사무엘

1
@RyanBerger--t가없는 것 같습니다. 이어야 od -t c file/path하지만 새 프로그램에 감사드립니다. 잘 했어!
Eric Fossum

113

우분투 14.04 :

간단하게 cat -e <filename>작동합니다.

그러면 Unix 줄 끝 ( \n또는 LF) 이 표시 $되고 Windows 줄 끝 ( \r\n또는 CRLF)이 표시됩니다 ^M$.


7
OSX에서도 작동합니다. 좋은 해결책. 받아 들여진 대답은 그렇지 않은 동안 단순하고 나를 위해 일했습니다. (참고 : .txt파일 이 아님 )
dlsso

4
M $ 표시가 easteregg / windows bashing입니까?
Tom M

솔라리스에서는 작동하지 않지만, 사람은 그것이 작동 했어야한다고 말합니다
Zeus

101

bash 쉘에서을 시도하십시오 cat -v <filename>. Windows 파일에 대한 캐리지 리턴이 표시되어야합니다.

(이것은 Windows XP의 Cygwin을 통해 rxvt에서 나에게 도움이되었습니다).

편집자 주 : (CR) 문자를 cat -v시각화 \r합니다. 로 ^M. 따라서 줄 끝\r\n 시퀀스는 ^M각 출력 줄의 끝에서와 같이 표시됩니다 . cat -e부가 적으로 시각화 할 \n즉 같이 $. ( cat -et탭 문자를 추가로 시각화합니다 ^I.)


3
@ChrisK : 시도 echo -e 'abc\ndef\r\n' | cat -v하고 ^M"def"다음에 표시되어야합니다 .
추후 공지가있을 때까지 일시 중지되었습니다.

파일에 ^ M (Windows / DOS EOL)이 있는지 확인하고 싶었지만 cat -v 만 표시했습니다. +1
Ali

1
^ M = DOS / Windows 스타일
Mercury

수정 : 따라서 줄 끝 \ r \ n 시퀀스는
Shayan

19

^M적은 양을 사용하는 것처럼 CR을 표시 less -u하거나 -u적은 양을 열면 열 수 있습니다.

man less 말한다 :

-u or --underline-special

      Causes backspaces and carriage returns to be treated  as  print-
      able  characters;  that  is,  they are sent to the terminal when
      they appear in the input.

1
답을 명확히하십시오.
adao7000

12

file그런 file -k다음 시도하십시오dos2unix -ih

file일반적으로 충분합니다. 그러나 어려운 경우에는 file -k또는을 시도하십시오 dosunix -ih.

자세한 내용은 아래를 참조하십시오.


시험 file -k

짧은 버전 : file -k somefile.txt 당신에게 말할 것입니다.

  • with CRLF line endingsDOS / Windows 줄 끝 을 출력 합니다.
  • with LF line endingsMAC 줄 끝을 출력 합니다.
  • 그리고 Linux / Unix 라인 "CR"의 경우 출력 text됩니다. (따라서 명시 적으로 언급하지 않으면 "CR 줄 끝"line endings 이라는 의미가 암시 적으로 나타납니다 .

긴 버전 은 아래를 참조하십시오.


실제 예 : 인증서 인코딩

때로는 PEM 인증서 파일을 확인해야합니다.

정규 문제 file 는 이것입니다. 때로는 너무 똑똑하거나 너무 구체적이려고합니다.

약간의 퀴즈를 시도해 봅시다 : 파일이 있습니다. 그리고이 파일들 중 하나는 줄 끝이 다릅니다. 어느 것?

(이것은 내 일반적인 "인증서 작업"디렉토리 중 하나입니다.)

정기적으로 시도해 봅시다 file.

$ file -- *
0.example.end.cer:         PEM certificate
0.example.end.key:         PEM RSA private key
1.example.int.cer:         PEM certificate
2.example.root.cer:        PEM certificate
example.opensslconfig.ini: ASCII text
example.req:               PEM certificate request

허. 줄 끝을 알려주지 않습니다. 그리고 나는 그것이 인증서 파일이라는 것을 이미 알고있었습니다 . 그 말을하기 위해 "파일"이 필요하지 않았습니다.

다른 무엇을 시도 할 수 있습니까?

다음 dos2unix과 같이 --info스위치를 사용해보십시오 .

$ dos2unix --info -- *
  37       0       0  no_bom    text    0.example.end.cer
   0      27       0  no_bom    text    0.example.end.key
   0      28       0  no_bom    text    1.example.int.cer
   0      25       0  no_bom    text    2.example.root.cer
   0      35       0  no_bom    text    example.opensslconfig.ini
   0      19       0  no_bom    text    example.req

yup, "0.example.end.cer"는 이상한 사람이어야합니다. 그러나 어떤 종류의 줄 끝이 있습니까? 수행 마음에 의해 DOS2UNIX 출력 형식을 알아? (아니요)

그러나 다행히도 --keep-going(또는 -k짧은) 옵션이 있습니다 file.

$ file --keep-going -- *
0.example.end.cer:         PEM certificate\012- , ASCII text, with CRLF line terminators\012- data
0.example.end.key:         PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer:         PEM certificate\012- , ASCII text\012- data
2.example.root.cer:        PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req:               PEM certificate request\012- , ASCII text\012- data

우수한! 이제 홀수 파일에 DOS ( CRLF) 줄 끝 이 있음을 알았습니다 . (그리고 다른 파일은 Unix ( LF) 줄 끝이 있습니다. 이것은이 출력에서 ​​명시 적이 지 않습니다. 암시 적입니다. file"일반적인"텍스트 파일을 기대하는 방식 일뿐 입니다.)

(내 니모닉을 공유하려면 "L"은 "Linux"및 "LF"입니다.)

이제 범인을 변환하고 다시 시도해 보겠습니다.

$ dos2unix -- 0.example.end.cer

$ file --keep-going -- *
0.example.end.cer:         PEM certificate\012- , ASCII text\012- data
0.example.end.key:         PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer:         PEM certificate\012- , ASCII text\012- data
2.example.root.cer:        PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req:               PEM certificate request\012- , ASCII text\012- data  

좋은. 이제 모든 인증서에는 유닉스 라인 엔딩이 있습니다.

시험 dos2unix -ih

위의 예를 작성할 때 이것을 알지 못했지만 다음과 같습니다.

실제로 dos2unix는 -ih(short --info=h)를 다음과 같이 사용하면 헤더 행을 제공합니다 .

$ dos2unix -ih -- *
 DOS    UNIX     MAC  BOM       TXTBIN  FILE
   0      37       0  no_bom    text    0.example.end.cer
   0      27       0  no_bom    text    0.example.end.key
   0      28       0  no_bom    text    1.example.int.cer
   0      25       0  no_bom    text    2.example.root.cer
   0      35       0  no_bom    text    example.opensslconfig.ini
   0      19       0  no_bom    text    example.req

또 다른 "실제로"순간 : 헤더 형식은 정말 기억하기 쉽습니다. 다음 두 가지 니모닉이 있습니다.

  1. DUMB입니다 (왼쪽에서 오른쪽으로 : Dos, d는 Unix, m은 Mac, b는 BOM).
  2. 또한 "DUM"은 D, U 및 M의 알파벳 순서입니다.

추가 자료


1
이 같은 출력을 생성 Accounts.java: Java source, ASCII text\012-MinTTY에서 Windows에서
혼자 서

@standalone : 흥미 롭습니다. "igncr"이라는 옵션에 대해 이상한 점을 읽었습니다. 그리고 당신이 말하는 것은 그렇게 들립니다. 그러나 당신이 묘사 한 것을 재현 할 수 없습니다. (Git-for-Windows, "git version 2.24.0.windows.1"과 함께 제공되는 박하 안에 Bash를 시도했습니다.
StackzOfZtuff

흠, 내가 노력 file -k Accounts.java도 자식를 위해 윈도우와 함께 제공되는 mintty 내부,하지만 내 버전입니다git version 2.21.0.windows.1
독립형

나를위한 작업 솔루션은cat -e file_to_test
독립형

9

당신이 사용할 수있는 xxd파일의 16 진 덤프를 표시하고 "0d0a"또는 "0a"문자를 찾는 데 .

cat -v <filename>@warriorpostman이 제안한대로 사용할 수 있습니다 .


1
cat v 8.23에서 작동합니다. 유닉스 라인 엔딩은 추가 정보를 인쇄하지 않지만 DOS 라인 엔딩은 "^ M"을 인쇄합니다.
Rich

유닉스 라인 엔딩을 사용하고 있다는 사실을 감안할 때 8.21과 함께 실행해야합니다.
neanderslob 2016 년

5

이 명령 todos filename을 사용하여 DOS 끝 fromdos filename으로 변환하고 UNIX 줄 끝으로 변환 할 수 있습니다. Ubuntu에 패키지를 설치하려면을 입력하십시오 sudo apt-get install tofrodos.


5

vim -b filename이진 모드에서 파일을 편집하는 데 사용할 수 있습니다. 캐리지 리턴에는 ^ M 문자가 표시되고 새 줄은 LF가 있음을 나타내며 Windows CRLF 줄 끝을 나타냅니다. LF는 의미 \n하고 CR은 의미 \r합니다. -b 옵션을 사용하면 파일은 [unix]상태 표시 줄에 표시된대로 기본적으로 항상 UNIX 모드에서 편집됩니다 . 즉, 새 행을 추가하면 CRLF가 아니라 LF로 끝납니다. CRLF 줄 끝이있는 파일에서 -b없이 일반 vim을 사용하는 경우 [dos]상태 줄에 표시되고 삽입 된 줄에는 줄 끝이 CRLF가됩니다. fileformats설정에 대한 vim 설명서 는 복잡성을 설명합니다.

또한 Notepad ++ 답변에 대해 언급 할 점이 충분하지 않지만 Windows에서 Notepad ++를 사용하는 경우 View / Show Symbol / Show End of Line 메뉴를 사용하여 CR 및 LF를 표시하십시오. 이 경우 LF가 표시되고 vim의 경우 LF가 새 행으로 표시됩니다.


0

출력을 텍스트 파일로 덤프합니다. 그런 다음 메모장 ++에서 열고 모든 문자 표시 버튼을 클릭하십시오. 매우 우아하지는 않지만 작동합니다.


3
이 질문은 Linux로 태그되어 있으며 notepad ++가 Linux 용이라고 생각하지 않습니다. 이것은 Windows에서 작동해야합니다.
Rick Smith

0

Vim-항상 Windows 줄 바꾸기를 ^M

vim에서 Windows 줄 바꿈이 항상으로 렌더링되는 것을 선호하는 ^M경우이 줄을 다음에 추가 할 수 있습니다 .vimrc.

set ffs=unix

이렇게하면 vim은 열려있는 모든 파일을 유닉스 파일로 해석합니다. 유닉스 파일은 \n개행 문자로되어 있기 때문에 개행 문자가있는 Windows 파일 \r\n은 여전히으로 올바르게 렌더링 \n되지만 () 덕분에 ^M파일 끝에 있습니다 (vim이 \r문자를 렌더링하는 방식 ).


Vim-때때로 Windows 줄 바꿈 표시

파일 단위로 설정하기 만하면 :e ++ff=unix주어진 파일을 편집 할 때 사용할 수 있습니다 .


Vim-항상 파일 형식 표시 ( unixvsdos )

vim의 맨 아랫 줄에 편집중인 파일 형식이 항상 표시되도록하고 파일 형식을 unix로 설정하지 않은 경우 statuslinewith에 추가 할 수 있습니다
set statusline+=\ %{&fileencoding?&fileencoding:&encoding}.

내 전체 상태 표시 줄이 아래에 제공됩니다. 에 추가하십시오 .vimrc.

" Make statusline stay, otherwise alerts will hide it
set laststatus=2
set statusline=
set statusline+=%#PmenuSel#
set statusline+=%#LineNr#
" This says 'show filename and parent dir'
set statusline+=%{expand('%:p:h:t')}/%t
" This says 'show filename as would be read from the cwd'
" set statusline+=\ %f
set statusline+=%m\
set statusline+=%=
set statusline+=%#CursorColumn#
set statusline+=\ %y
set statusline+=\ %{&fileencoding?&fileencoding:&encoding}
set statusline+=\[%{&fileformat}\]
set statusline+=\ %p%%
set statusline+=\ %l:%c
set statusline+=\ 

다음과 같이 렌더링됩니다

.vim/vimrc\                                    [vim] utf-8[unix] 77% 315:6

파일 맨 아래


Vim-때때로 파일 형식 표시 ( unixvs dos)

어떤 유형의 파일을보고 싶을 경우 사용할 수 있습니다 :set fileformat( 파일 유형을 강제로 설정하면 작동하지 않습니다). unix유닉스 파일과 dosWindows를 반환 합니다 .

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