จะหาคำลงท้ายบรรทัดในไฟล์ข้อความได้อย่างไร?


304

ฉันพยายามที่จะใช้บางสิ่งบางอย่างในการทุบตีเพื่อแสดงให้ฉันเห็นสายที่สิ้นสุดในไฟล์ที่พิมพ์แทนที่จะตีความ ไฟล์นี้เป็นดัมพ์จาก SSIS / SQL Server ที่กำลังอ่านโดยเครื่อง Linux สำหรับการประมวลผล

  • มีสวิทช์ใด ๆ ภายในvi, less, moreetc?

  • นอกเหนือจากการเห็นจุดสิ้นสุดบรรทัดฉันจำเป็นต้องทราบประเภทของจุดสิ้นสุดบรรทัด ( CRLFหรือLF) ฉันจะหาสิ่งนั้นได้อย่างไร


1
คำแนะนำทั่วไป: หากคุณมีความคิดว่าคำสั่ง * nix / cygwin ที่คุณอาจใช้คุณสามารถดู manpage เพื่อค้นหาสวิตช์ที่อาจให้ฟังก์ชั่นที่คุณต้องการ เช่นman less.
David Rivers

คำตอบ:


421

คุณสามารถใช้fileยูทิลิตีนี้เพื่อระบุประเภทของการสิ้นสุดบรรทัด

Unix:

$ file testfile1.txt
testfile.txt: ASCII text

"ดอส":

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

วิธีแปลงจาก "DOS" ถึง Unix:

$ dos2unix testfile2.txt

วิธีแปลงจาก Unix เป็น "DOS":

$ unix2dos testfile1.txt

การแปลงไฟล์ที่แปลงแล้วไม่มีผลใด ๆ ดังนั้นจึงปลอดภัยที่จะเรียกใช้แบบสุ่มสี่สุ่มห้า


9
บางครั้งตอนนี้ชื่อ "fromdos" และ "todos" ตามลำดับ (ตามกรณีใน Ubuntu 10.4+)
Jess Chadwick

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 ที่คำถามนั้นอธิบายถึงปัญหาอย่างชัดเจนเท่านั้น
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

คำสั่งไฟล์ @DennisWilliamson ก่อนและหลังคำสั่ง dos2unix มีเอาต์พุตเดียวกัน: xxx.c แหล่ง C, ข้อความ ASCII พร้อมด้วยตัวยุติสาย CR, LF ฉันพบไฟล์ c นี้มี ^ M อยู่ตรงกลางบรรทัดซึ่งชอบ xxxxxxx ^ M xxxxxxx
nathan

127

ในvi...

:set list เพื่อดูจุดสิ้นสุดบรรทัด

:set nolist เพื่อกลับสู่ปกติ

ในขณะที่ฉันไม่คิดว่าคุณจะสามารถเห็น\nหรือ\r\nเข้าviคุณสามารถดูประเภทของไฟล์ (UNIX, DOS, ฯลฯ ) เพื่ออนุมานว่าจุดสิ้นสุดของบรรทัดที่มี ...

:set ff

อีกทางหนึ่งจากbashคุณสามารถใช้od -t c <filename>หรือเพียงod -c <filename>เพื่อแสดงผลตอบแทน


26
น่าเสียดายที่ฉันไม่คิดว่า vi จะสามารถแสดงตัวละครเหล่านั้นได้ คุณสามารถลอง od -c <filename> ซึ่งฉันเชื่อว่าจะแสดง \ n หรือ \ r \ n
Ryan Berger

3
ในหมวดหมู่ "สำหรับสิ่งที่คุ้มค่า" คุณสามารถ grep สำหรับ Dos style CRLF โดยการออก grep --regex = "^ M" โดยที่ ^ M คือ CTRL + V CTRL + M คุณสามารถลบสิ่งเหล่านั้นได้ด้วยการแทนที่คำสั่ง sed สิ่งนี้ทำสิ่งเดียวกับ dos2unix
cowboydan

11
ในกลุ่ม: :set fileformatจะรายงานว่าunixหรือเป็นกลุ่มคิดว่าไฟล์ปลายสายอยู่ในคุณสามารถเปลี่ยนมันได้ด้วย.dos :set fileformat=unix
Victor Zamanian

5
ใช้แฟล็ก -b เมื่อเริ่มต้น vi / vim จากนั้นใช้: set list เพื่อดูจุดสิ้นสุด CR (^ M) และ LF ($)
ซามูเอล

1
@RyanBerger - ดูเหมือนว่าคุณไม่มี -t มันควรจะเป็นod -t c file/pathแต่ขอบคุณสำหรับโปรแกรมใหม่ ใช้งานได้ดีมาก!
Eric Fossum

113

Ubuntu 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

cat -v <filename>ในเปลือกทุบตีลอง สิ่งนี้ควรแสดง carriage-return สำหรับไฟล์ windows

(สิ่งนี้ใช้ได้กับฉันใน rxvt ผ่าน Cygwin บน Windows XP)

หมายเหตุจากบรรณาธิการ: cat -vvisualize \rchars () ^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 สำหรับสิ่งนั้น
อาลี

1
^ M = สไตล์ DOS / Windows
Mercury

การแก้ไข: ดังนั้นลำดับบรรทัดสิ้นสุด \ r \ n จะแสดงเป็น ^ M $
Shayan

19

หากต้องการแสดง CR ว่า^Mใช้งานน้อยลง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 -kdosunix -ih

รายละเอียดด้านล่าง


ลอง file -k

เวอร์ชั่นสั้น: file -k somefile.txtจะบอกคุณ

  • มันจะออกมาwith CRLF line endingsสำหรับการสิ้นสุดบรรทัด DOS / Windows
  • มันจะแสดงผลwith LF line endingsสำหรับการสิ้นสุดสาย MAC
  • และสำหรับ Linux / Unix line "CR" มันก็จะแสดงผลออกtextมา (ดังนั้นหากไม่ได้กล่าวถึงชนิดใด ๆ อย่างชัดเจนline endingsก็หมายความว่า: "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

ยอดเยี่ยม ตอนนี้เรารู้แล้วว่าไฟล์คี่ของเรามีCRLFตอนท้ายของDOS ( ) (และไฟล์อื่น ๆ มีLFจุดสิ้นสุดบรรทัดUnix ( ) ซึ่งไม่ชัดเจนในเอาต์พุตนี้โดยปริยายมันเป็นเพียงวิธีที่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  

ดี. ตอนนี้ certs ทั้งหมดมีจุดสิ้นสุดบรรทัด Unix

ลอง dos2unix -ih

ฉันไม่รู้สิ่งนี้เมื่อฉันเขียนตัวอย่างด้านบน แต่:

ที่จริงแล้วปรากฎว่า dos2unix จะให้บรรทัดส่วนหัวแก่คุณหากคุณใช้-ih(ย่อมา--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 (จากซ้ายไปขวา: d สำหรับ Dos, u สำหรับ Unix, m สำหรับ Mac, b สำหรับ BOM)
  2. และ: "DUM" เป็นเพียงการเรียงลำดับตัวอักษรของ D, U และ M

อ่านเพิ่มเติม


1
มันสร้างผลลัพธ์เช่น: Accounts.java: Java source, ASCII text\012-บน Windows ใน MinTTY
อยู่คนเดียว

@standalone: ​​น่าสนใจ ฉันได้อ่านเรื่องแปลก ๆ เกี่ยวกับตัวเลือกที่เรียกว่า "igncr" - และสิ่งที่คุณพูดนั้นฟังดูเหมือนอย่างนั้น แต่ไม่สามารถทำซ้ำสิ่งที่คุณอธิบาย (ฉันลองใช้ Bash ใน mintty ที่มาพร้อมกับ Git-for-Windows "git เวอร์ชั่น 2.24.0.windows.1"))
StackzOfZtuff

หืมมฉันพยายามfile -k Accounts.javaในมินต์ที่มาพร้อมกับ git-for-windows ด้วย แต่รุ่นของฉันคือgit version 2.21.0.windows.1
ยืนอยู่คนเดียว

วิธีแก้ปัญหาสำหรับฉันคือcat -e file_to_test
ยืนอยู่คนเดียว

9

คุณสามารถใช้xxdเพื่อแสดงการถ่ายโอนข้อมูลฐานสิบหกของไฟล์และตามหาตัวอักษร "0d0a" หรือ "0a"

คุณสามารถใช้cat -v <filename>เป็น @warriorpostman แนะนำ


1
มันใช้งานได้สำหรับฉันกับ cat v 8.23 การจบบรรทัด Unix จะไม่พิมพ์ข้อมูลพิเศษใด ๆ แต่การจบบรรทัด DOS จะพิมพ์ "^ M"
Rich

นั่นต้องเป็นสิ่งที่ฉันกำลังใช้กับ 8.21 เนื่องจากข้อเท็จจริงที่ว่าฉันใช้ปลายสายยูนิกซ์
neanderslob

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]ในบรรทัดสถานะหมายความว่าหากคุณเพิ่มบรรทัดใหม่พวกเขาจะลงท้ายด้วย LF ไม่ใช่ CRLF หากคุณใช้ vim ปกติโดยไม่มี -b ในไฟล์ที่มีการสิ้นสุดบรรทัด CRLF คุณควรเห็นการ[dos]แสดงในบรรทัดสถานะและบรรทัดที่แทรกจะมี CRLF เป็นจุดสิ้นสุดของบรรทัด เอกสารที่เป็นกลุ่มสำหรับfileformatsการตั้งค่าอธิบายความซับซ้อน

นอกจากนี้ฉันยังมีคะแนนไม่เพียงพอที่จะแสดงความคิดเห็นในคำตอบของ Notepad ++ แต่ถ้าคุณใช้ Notepad ++ บน Windows ให้ใช้เมนูมุมมอง / แสดงสัญลักษณ์ / แสดงจุดสิ้นสุดของบรรทัดเพื่อแสดง CR และ LF ในกรณีนี้ LF จะปรากฏขึ้นในขณะที่สำหรับกลุ่ม LF จะถูกระบุด้วยบรรทัดใหม่


0

ฉันดัมพ์เอาต์พุตไปยังไฟล์ข้อความ ฉันเปิดมันใน notepad ++ แล้วคลิกปุ่มแสดงตัวอักษรทั้งหมด ไม่หรูหรามาก แต่ใช้งานได้


3
คำถามนี้ถูกแท็กเป็น Linux และฉันไม่คิดว่า notepad ++ สำหรับ Linux สิ่งนี้ควรใช้กับ windows ได้
Rick Smith

0

เป็นกลุ่ม - แสดงบรรทัดใหม่ของ Windows เป็นเสมอ ^M

หากคุณต้องการดูการขึ้นบรรทัดใหม่ของ Windows ในรูปแบบ vim เป็น^Mคุณสามารถเพิ่มบรรทัดนี้ใน.vimrc:

set ffs=unix

สิ่งนี้จะทำให้ vim ตีความทุกไฟล์ที่คุณเปิดเป็นไฟล์ unix เนื่องจากไฟล์ unix มี\nอักขระขึ้นบรรทัดใหม่ไฟล์ windows ที่มีอักขระขึ้นบรรทัดใหม่ของ\r\nจะยังคงแสดงผลอย่างถูกต้อง (ขอบคุณ\n) แต่จะมี^Mที่ส่วนท้ายของไฟล์ (ซึ่งเป็นวิธีที่ vim แสดง\rอักขระ)


เป็นกลุ่ม - บางครั้งแสดงบรรทัดใหม่ของ Windows

หากคุณต้องการตั้งเป็นแบบต่อไฟล์คุณสามารถใช้:e ++ff=unixเมื่อแก้ไขไฟล์ที่กำหนด


เป็นกลุ่ม - แสดงประเภทไฟล์เสมอ ( unixvs dos)

หากคุณต้องการบรรทัดด้านล่างของกลุ่มที่จะแสดงสิ่งที่มักจะ filetype คุณกำลังแก้ไข (และคุณไม่ได้บังคับให้ตั้ง filetype เพื่อยูนิกซ์) คุณสามารถเพิ่มของคุณด้วยstatusline
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

ที่ด้านล่างของไฟล์ของคุณ


เป็นกลุ่ม - บางครั้งแสดงประเภทไฟล์ ( unixvs dos)

หากคุณต้องการดูว่าคุณมีไฟล์ประเภทใดคุณสามารถใช้:set fileformat(สิ่งนี้จะไม่ทำงานหากคุณบังคับให้ตั้งประเภทไฟล์) มันจะกลับมาunixสำหรับไฟล์ unix และdosสำหรับ Windows

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.