टेक्स्ट फ़ाइल में लाइन-एंडिंग का पता कैसे करें?


304

मैं bash में कुछ का उपयोग करने की कोशिश कर रहा हूँ मुझे व्याख्या के बजाय मुद्रित फ़ाइल में लाइन अंत दिखाने के लिए। फ़ाइल SSIS / SQL सर्वर से एक डंप है जिसे प्रोसेसिंग के लिए लिनक्स मशीन द्वारा पढ़ा जा रहा है।

  • वहाँ के भीतर किसी भी स्विच कर रहे हैं vi, less, more, आदि?

  • लाइन-एंडिंग देखने के अलावा, मुझे यह जानना होगा कि यह किस प्रकार की लाइन अंत है ( CRLFया LF)। मुझे यह कैसे पता चलेगा?


1
सामान्य टिप: यदि आपको इस बात का अंदाजा हो जाए कि आप किस * nix / cygwin कमांड का उपयोग कर सकते हैं, तो आप स्विच के लिए खोज करने के लिए हमेशा उसका मैनपेज देख सकते हैं जो आपको आवश्यक कार्यक्षमता दे सकता है। जैसे man less,।
डेविड रिवर्स

जवाबों:


421

आप fileउपयोगिता का उपयोग करने के लिए आपको लाइन एंडिंग के प्रकार का संकेत दे सकते हैं।

यूनिक्स:

$ file testfile1.txt
testfile.txt: ASCII text

"करने योग्य":

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

"DOS" से यूनिक्स में बदलने के लिए:

$ dos2unix testfile2.txt

यूनिक्स से "डॉस" में परिवर्तित करने के लिए:

$ unix2dos testfile1.txt

पहले से परिवर्तित फ़ाइल में कनवर्ट करने का कोई प्रभाव नहीं होता है, इसलिए यह आँख बंद करके (यानी पहले प्रारूप का परीक्षण किए बिना) सुरक्षित है, हालांकि सामान्य अस्वीकरण हमेशा की तरह लागू होते हैं।


9
इन्हें अब कभी-कभी "डिडोस" और "टॉडोस" नाम दिया जाता है, क्रमशः (जैसा कि Ubuntu 10.4+ में मामला है)
जेस चैडविक

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विफल रहता है? उस सवाल पर ओपी केवल इस मुद्दे का अस्पष्ट वर्णन करता है।
अगली सूचना तक रोक दिया गया।

Dos2unix कमांड के पहले और बाद में @DennisWilliamson फाइल कमांड को एक ही आउटपुट मिला: xxx.c C सोर्स, ASCII टेक्स्ट, CR, LF लाइन टर्मिनेटर के साथ। मैंने पाया कि इस सी फ़ाइल में लाइन के बीच में ^ 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 प्रदर्शित करेगा।
रयान बर्जर

3
"इसके लायक क्या है" श्रेणी में आप grep --regex = "^ M" को जारी करके डॉस शैली CRLF के लिए grep कर सकते हैं, जहाँ M CTRL + V CTRL + M है। आप उन लोगों को हटा सकते हैं जिनके साथ एक sed कमांड है। यह अनिवार्य रूप से dos2unix जैसी ही चीज करता है
चरवाहे

11
Vim में: :set fileformatरिपोर्ट करेगा कि कौन सी unixया dosvim सोचती है कि फ़ाइल की लाइन एंडिंग में है। आप इसे बदल सकते हैं :set fileformat=unix
विक्टर ज़मानियन

5
Vi / vim शुरू करते समय -b ध्वज का उपयोग करें और फिर सेट का उपयोग करें: CR (^ M) और LF ($) एंडिंग देखने के लिए सूची सेट करें।
शमूएल

1
@RyanBerger - लगता है कि आप एक -t को याद कर रहे हैं। यह होना चाहिए od -t c file/path, लेकिन नए कार्यक्रम के लिए धन्यवाद। बढ़िया काम किया!
एरिक फॉसम सिप

113

Ubuntu 14.04:

सरल cat -e <filename> काम ठीक है।

यह यूनिक्स लाइन एंडिंग ( \nया LF) के रूप में $और विंडोज लाइन एंडिंग ( \r\nया CRLF) को प्रदर्शित करता है ^M$


7
OSX पर भी काम करता है। अच्छा समाधान। सरल और मेरे लिए काम किया जबकि स्वीकृत उत्तर नहीं दिया। (नोट: एक .txtफाइल नहीं थी )
१so

4
M $ का प्रदर्शन एक पूर्वी क्षेत्र / विंडोज़ को कोसने वाला है?
टॉम एम

सोलारिस के साथ काम नहीं करता है, लेकिन आदमी कहता है कि यह काम करना चाहिए था
ज़ीउस

101

बैश शेल में, प्रयास करें cat -v <filename> । यह खिड़कियों की फाइलों के लिए कैरिज-रिटर्न प्रदर्शित करना चाहिए।

(यह मेरे लिए Windows XP पर Cygwin के माध्यम से rxvt में काम किया)।

संपादक का नोट: cat -vविज़ुअलाइज़ेशन \r(CR) वर्ण। के रूप में ^M। इस प्रकार, लाइन-एंडिंग \r\nसीक्वेंस ^Mप्रत्येक आउटपुट लाइन के अंत में प्रदर्शित होंगे । cat -eइसके अतिरिक्त कल्पना करेंगे \n, जैसे कि $। ( cat -etइसके अलावा टैब वर्णों की कल्पना करेंगे ^I।)


3
@ क्रिस: प्रयास करें echo -e 'abc\ndef\r\n' | cat -vऔर आपको ^M" डीफ़ " के बाद देखना चाहिए ।
अगली सूचना तक रोक दिया गया।

मैं यह देखना चाहता था कि क्या फ़ाइल में ^ M (Windows / DOS EOL) है और केवल कैट -v ने मुझे दिखाया है। इसके लिए +1
अली

1
^ M = DOS / विंडोज शैली
बुध

सुधार: इस प्रकार, लाइन-एंडिंग \ r \ n सीक्वेंस ^ M $
Shayan

19

सीआर को ^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 -kया dosunix -ih

नीचे दिए गए विवरण।


प्रयत्न file -k

लघु संस्करण: file -k somefile.txt आपको बताएगा।

  • यह with CRLF line endingsडॉस / विंडोज लाइन एंडिंग के लिए आउटपुट देगा ।
  • यह with LF line endingsMAC लाइन एंडिंग के लिए आउटपुट देगा ।
  • और लिनक्स / यूनिक्स लाइन "सीआर" के लिए यह सिर्फ आउटपुट होगा text। (इसलिए यदि यह स्पष्ट रूप से किसी भी प्रकार का उल्लेख नहीं करता है, 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

तो यह आपको बताता है कि: हाँ, "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) लाइन अंत है। (और अन्य फाइलों में यूनिक्स ( LF) लाइन एंडिंग है। यह इस आउटपुट में स्पष्ट नहीं है। यह अंतर्निहित है। यह सिर्फ fileएक "नियमित" पाठ फ़ाइल होने की उम्मीद है।)

(यदि आप मेरे mnemonic को साझा करना चाहते हैं: "L" "लिनक्स" के लिए और "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(छोटे के लिए --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 के लिए d, Unix के लिए u, Mac के लिए m, B के लिए b)।
  2. और यह भी: "डीयूएम" केवल डी, यू और एम के वर्णमाला क्रम है।

आगे की पढाई


1
यह आउटपुट उत्पन्न करता है जैसे: Accounts.java: Java source, ASCII text\012-विंडोज पर मिन्टटी में
अकेले खड़े हों

समझना: दिलचस्प। मैंने "igncr" नामक एक विकल्प के बारे में अजीब बातें पढ़ी हैं - और जो आप कह रहे हैं वह ऐसा लगता है। लेकिन जो आप वर्णन करते हैं उसे पुन: पेश नहीं कर सकते। (मैंने गेट-इन-विंडोज के साथ बैश के अंदर कोशिश की, जो कि गिट-फॉर-विंडोज के साथ आता है, "git संस्करण 2.24.0.indows..1"।)
StackzOfZtuff

हम्म, मैंने file -k Accounts.javaमिनिट के अंदर कोशिश की जो गिट-फॉर-विंडो के साथ भी आती है, लेकिन मेरा संस्करण हैgit version 2.21.0.windows.1
अकेले खड़े रहो

मेरे लिए काम करने का उपाय हैcat -e file_to_test
अकेले खड़े रहो

9

आप xxdफ़ाइल के हेक्स डंप को दिखाने के लिए उपयोग कर सकते हैं , और "0d0a" या "0a" वर्ण के लिए शिकार कर सकते हैं ।

आप cat -v <filename>@warriorpostman के सुझाव के अनुसार उपयोग कर सकते हैं ।


1
यह मेरे लिए बिल्ली v 8.23 ​​के साथ काम करता है। यूनिक्स लाइन एंडिंग किसी भी अतिरिक्त जानकारी को प्रिंट नहीं करेगा, लेकिन डॉस लाइन एंडिंग एक "^ एम" प्रिंट करेगा।
रिच

यह होना चाहिए कि मैं 8.21 के साथ चल रहा हूं, इस तथ्य को देखते हुए कि मैं यूनिक्स लाइन अंत का उपयोग कर रहा हूं।
निएंडरस्लो

5

आप todos filenameDOS एंडिंग्स में कनवर्ट करने के लिए कमांड का उपयोग कर सकते हैं , और fromdos filenameUNIX लाइन एंडिंग्स में कनवर्ट करने के लिए। उबंटू पर पैकेज स्थापित करने के लिए, टाइप करें sudo apt-get install tofrodos


5

आप vim -b filenameकिसी फ़ाइल को बाइनरी मोड में संपादित करने के लिए उपयोग कर सकते हैं , जिसमें गाड़ी वापसी के लिए ^ M वर्ण दिखाई देंगे और एक नई पंक्ति LF के मौजूद होने का संकेत है, जो कि Windows CRLF लाइन अंत का संकेत है। LF से मेरा मतलब है \nऔर CR से मेरा मतलब है \r। ध्यान दें कि जब आप -b विकल्प का उपयोग करते हैं, तो फ़ाइल हमेशा UNIX मोड में डिफ़ॉल्ट रूप से संपादित की जाएगी जैसा कि [unix]स्टेटस लाइन द्वारा इंगित किया गया है, जिसका अर्थ है कि यदि आप नई लाइनें जोड़ते हैं तो वे LF के साथ समाप्त हो जाएंगे, CRLF नहीं। यदि आप CRLF लाइन एंडिंग वाली फ़ाइल पर सामान्य vim बिना -b का उपयोग करते हैं, तो आपको [dos]स्टेटस लाइन में दिखाया जाना चाहिए और सम्मिलित लाइनों में लाइन के अंत में CRLF होगा। fileformatsसेटिंग के लिए विम प्रलेखन जटिलताओं की व्याख्या करता है।

इसके अलावा, मेरे पास नोटपैड ++ उत्तर पर टिप्पणी करने के लिए पर्याप्त अंक नहीं हैं, लेकिन यदि आप विंडोज पर नोटपैड ++ का उपयोग करते हैं, तो सीआर और एलएफ को प्रदर्शित करने के लिए लाइन मेनू के दृश्य / शो प्रतीक / शो एंड का उपयोग करें। इस मामले में एलएफ दिखाया गया है, जबकि विम के लिए एलएफ को एक नई लाइन द्वारा दर्शाया गया है।


0

मैं अपने आउटपुट को टेक्स्ट फ़ाइल में डंप करता हूं। मैं फिर इसे नोटपैड ++ में खोलता हूं और फिर शो सभी वर्ण बटन पर क्लिक करता हूं। बहुत सुंदर नहीं है लेकिन यह काम करता है।


3
यह प्रश्न लिनक्स के रूप में टैग किया गया है और मुझे नहीं लगता कि नोटपैड ++ लिनक्स के लिए है। यह हालांकि खिड़कियों के लिए काम करना चाहिए।
रिक स्मिथ

0

Vim - हमेशा के रूप में Windows newlines दिखाते हैं ^M

यदि आप हमेशा vim रेंडर में Windows newlines देखना पसंद करते हैं ^M, तो आप इस लाइन को अपने साथ जोड़ सकते हैं .vimrc:

set ffs=unix

यह आपके द्वारा खोली गई प्रत्येक फ़ाइल को एक यूनिक्स फ़ाइल के रूप में व्याख्या करेगा। चूँकि यूनिक्स फ़ाइलों \nमें न्यूलाइन वर्ण होता है, एक नई लाइन के साथ एक विंडोज़ फाइल \r\nअभी भी ठीक से प्रस्तुत होगी (धन्यवाद \n) लेकिन ^Mफाइल के अंत में होगा (जो कि कैसे \rचरित्र को प्रस्तुत करता है)।


विम - कभी-कभी विंडोज की नई सुर्खियाँ दिखाते हैं

यदि आप इसे प्रति-फ़ाइल के आधार पर सेट करना पसंद करते हैं, तो आप :e ++ff=unixकिसी दिए गए फ़ाइल को संपादित करते समय उपयोग कर सकते हैं ।


विम - हमेशा फ़िलाटाइप दिखाएं ( unixबनाम dos)

यदि आप चाहते हैं कि vim की निचली रेखा हमेशा यह प्रदर्शित करे कि आप किस फिलामेंट का संपादन कर रहे हैं (और आपने फ़िक्साइप को यूनिक्स में सेट नहीं किया है) तो आप अपने 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

आपकी फ़ाइल के नीचे


विम - कभी-कभी फ़िलाटाइप ( unixबनाम) दिखाते हैंdos )

यदि आप केवल यह देखना चाहते हैं कि आपके पास किस प्रकार की फ़ाइल है, तो आप इसका उपयोग कर सकते हैं :set fileformat(यदि आप फ़ाइल को सेट करने के लिए बाध्य करते हैं तो यह काम नहीं करेगा)। यह unixयूनिक्स फ़ाइलों और dosविंडोज के लिए वापस आ जाएगा ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.