Linux за българи: Форуми

Linux секция за начинаещи => Настройка на програми => Темата е започната от: go_fire в Oct 07, 2012, 19:22



Титла: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: go_fire в Oct 07, 2012, 19:22
Здравейте,

Имам един елементарен въпрос, на които обаче поради не методичността на образованието си (сиреч самообучение), не знам отговора.

И така имаме някакъв текстов документ, какъвто и да е, няма значение за момента кодировка, съдържание или каквото и да било, обикновен текстов документ. Как мога със сигурност да разбера, с какви символи завършват редовете (май края на документа няма значение в случая).

Обикновените текстовите редактори, които знам и съм ползвал, са достатъчно умни, че в движение да преведат символите за край между трите ОС. Не мога по тях да разбера, като не ми се показват грешно документите, за които знам, че са направени под друга ОС.

Имам някакво предположение, че трябва да разгледам документа под някакъв шестнадесетичен редактор или нещо такова. Само дето не знам такива за любимата ОС. А и колкото пъти съм погледнал в такъв редактор, толкова пъти нищичко не съм разбрал, всичко е на марсиански.

Та така известни ли са Ви начини, как със сигурност да се установи, с каква поредица от служебни символи, завършва един ред?


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: neter в Oct 07, 2012, 19:41
Изходът от командата file достатъчен ли ти е? Пример
Цитат
$ file proba
proba: ASCII text, with CRLF line terminators
CRLF са нови редове, като тези в Windows (\r\n).

Цитат
$ file proba
proba: ASCII text, with CR line terminators
CR са нови редове, като тези в Mac (\r).

Цитат
$ file proba
proba: ASCII text
Пример за изход, когато новите редове са като стандартно използваните в Линукс (\n).


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: dejuren в Oct 07, 2012, 20:08
cat -A при положение, че различните редове завършват различно и търсиш как завършва определен ред. Изходът не е толкова добре поднесен като file, но пък се вижда всеки конкретен ред.


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: neter в Oct 07, 2012, 20:33
А, да. За протокола, пример от file, когато имаме файл, в който различните редове завършват различно
Цитат
$ file proba
proba: ASCII text, with CRLF, CR, LF line terminators

Пак за протокола, с file може да се намери как завършва и точно определен ред, като се включи дебъгването (опцията "-d"), но... е по-голям мазохизъм от "cat -A", така че само в краен случай :)


Титла: jEdit
Публикувано от: remotex в Oct 07, 2012, 20:38
Ако търсиш текстов редактор който показва това пробвай jedit
долу вдясно показва WMU : Windows, Mac, Unix  and click to change - ако искаш да го конвертира при запис


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: go_fire в Oct 07, 2012, 20:45
Дежурен варианта ти е отличен, но не знам, какво да гледам на цат -А. Изкарва ми много неща, явно всичко дето не е латиница излиза зле. Доколкото разбирам ми изкарва съдържанието на файла. Малко трудно се ориентирах. По опит май стигнах до заключение, че нормалните излизат с $, а досовските с ^M$ накрая. Нямам намацан документ да видя те как излизат (би трябвало ^M).

Обаче трябва да намеря начин да видя само крайщата, защото редовете са дълги, излизат твърде неудобно на по няколко реда и е невъзможно да се обхванат с поглед в моя случай.  Ако знам точно колко са дълги редовете (еднакви са), мога ли някак си да изкарам само края им?

Нетер аз разбира се знаех за file, но досега не му намирах практическо приложение, защото за малкото неща дето не знам какви са, той не ми е давал информация. Сигурно следва някакъв ограничен стандарт.

В случая пробвах няколко неща. На едното ми даде:  UTF-8 Unicode text. Друг ми го даде UTF-8 Unicode text, with CRLF line terminators. Най-интересен ми беше тоя дето, най-много ме интересува. Той ми даде:

Non-ISO extended-ASCII text, with CRLF, NEL line terminators

Защо е Non-ISO extended-ASCII text, разбрах от предната си тема, дето се оказа, че е МИК. CRLF е това, от което се интересувам. Но какво е NEL line terminators  ???

Благодаря и на Ремотех. Да имам jedit, защото за него е писан Lazy8, който така и не подкарах, защото не можах да го свържа с мъсял :(

А да това -d ми изкара някакви много страшни неща от сорта на:
> 0 search/w/1,=<?XML,"broken XML document text"]
> 0 search/1,=begin ,"uuencoded or xxencoded text"]
> 0 search/1,=$\nship,"ship'd binary text"]
> 0 search/c/1,=@book{,"BibTeX text file"]
> 0 search/wc/4096,=<style,"HTML document text"]

И т.н. в само един средно дълъг документ (под сто реда), направо се уплаших и нищо не разбрах.

Отново благодаря и на трима Ви. Тоя форум е чисто злато.


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: remotex в Oct 07, 2012, 20:56
може и с mc
Midnight Commander демек
(за съжаление директно с mcedit не става щото го отваря за редакция)
mc
F3, после F4 (и F8/F9 евентуално)
вътре от редактора избираш кодировка с
alt-E
мисля че работи само с инсталираните на системно ниво или може би с каквото е компилиран...

П.П. Тези също вършат работа... ако файла има нов ред накрая - гледаш само последния символ
cat -e myfile.txt
^M = CR   $ = LF   ^M$ = CRLF
hexdump -c myfile.txt
\r = CR    \n = LF   \r\n = CRLF


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: go_fire в Oct 07, 2012, 21:06
Ремотех отново добро попадение. Най-после открих шестнадесетичен редактор и за ГНУ/Линукс. Редовете свършват на 0D 0A, както и очаквах. Но това е само, защото знам къде свършват редовете, обаче, ако не знаех, как се разбира стандартно?

А то не било редактор, а само преглеждачка (няма го в mcedit), ама то едва ли бих редактирал нещо в шестнадесетичен режим.


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: remotex в Oct 07, 2012, 21:14
Най-общо казано - Не можеш "стандартно"
Трябва ти малко предварително познание т.е. повечето софтуер ползва нещо наречено "Автоматично откриване на езика" и на "Кодировката" т.е. горе-долу следното
1) трябва да се определи типа на файла - може да е двоичен тогава нямаш нови редове
2) каква му е кодировката - напр. при UCS-2 или др. бинарна кодировка може да имаш тези кодове 10 и 13 а случайни места т.е. всяка двубайтова комбинация в която поне единия байт е 10 или 13
В случай на UTF-8, plain text, local 8 bit: 1251, 1252, latin1 и пр. подобни обик. СПОКОЙНО може да се 3) приеме че са чист текст, но ДОРИ В един такъв файл може да имаш и от трите кодировки - какво правим тогава...

П.П. напр. след като вече имаш 16тичен редактов направи си сам един файл в който ред1-ДОС/Уин, ред2-Юникс, ред3-Мак. - като какъв очакваш да се разпознае автоматично?!

П.П.П. Инак "стандартно" първото което ми иде наум е следното :
с всеки редактор който поддържа т.нар. character(s) distribution, Statistic(s) и пр. което се среща най-често от тези трите 10, 13 и 1013 :-)
напр. с мойта okteta : Tools.Statistics [Build]


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: go_fire в Oct 07, 2012, 21:18
Е тук вече се предавам, много над моето ниво на разбиране е. Благодаря и за това hexdump, съвсем ясно си показва символите за край:

Цитат
[…]
*
0003240                   0   0   0   0   5   8  \r  \n   B   G   6   9
0003250   T   T   B   B   9   4   0   0   1   5   2   4   2   4   5   1
0003260   1   6                                                   5   8
0003270   0   4   0   9   1   7   3   2 236   �   �   �     202   �   �
0003280   �   �   �   �   �   �   �     202   �   �   �   �   �   �   
0003290           1   0   /   0   9   /   1   2                       
00032a0               6   2   8   .   0   6   B   G   N   3   1   0   0
00032b0   0   4   6   0   8   5                                       
00032c0           0   0   0   1   5   2   0   6   1     217 214 203   
00032d0   " 205   �   �   �   �   �     200   �   �   �   �       I   "
00032e0                           1   0   /   0   9   /   1   2 207   �
00032f0   �   �   �   �   �                                           
0003300                                                               
*
0003320           0   0   0   0   5   9  \r  \n                       
0003330                                             216 201 231 200   
0003340 221 223 214 200   :                                           
0003350               2   6   0   0   6   .   5   0  \r  \n         


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: neter в Oct 07, 2012, 21:20
Не е нужно да се минава през mc, за да отвори файла в режим за преглед (F3) - има си директен mcview. А и с mcedit се вижда какъв е типът на новите редове. Например
Цитат
едно^Mдве
три^M
четири
Между "едно" и "две" имаме CR (\r), между "две" и "три" имаме LF (\n), а между "три" и "четири" имаме CRLF (\r\n). По същия начин, както при "cat -A" имаме съответно ^M, $ и ^M$.

go_fire, по-подробно описание за NEL има тук ($2). А за страшните редове във "file -d", не им обръщай внимание. Теб те интересува тази част от изхода
Цитат
mget @0: edno\rdve\ntri\r\nchetriri\n\000\000\000\000\000\000\000\000\000
където можеш да видиш новите редове, изписани в познатите ти символи \r, \n и \r\n.

В крайна сметка mcedit и mcview май ти вършат най-добра работа, заради по-лесното превключване между различни кодировки :) В mcview текстът ти в не-hex формат седи от дясната част на екрана.


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: go_fire в Oct 07, 2012, 21:26
Благодаря Нетер. Странно, че mcedit ми дава €М за редовете, които всички останали до тук цитирани начини показваха €М$. Иначе съвсем определено е най-прегледно с тях двете.

Направо се шашнах, не подозирах, че съществуват толкова много начини.


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: remotex в Oct 07, 2012, 21:30
neter проблемът му е че показва същото '^M' както за ДОС/Уин така и за МАК
Как да ги разграничи двете

и аз лично бих предпочел tail | hexdump и да се гледа само как свършва последния ред
а между другото не знам tail как ще преброи редовете

П.П. А бе вие направихте ли си поне 3 различни файла с ДОС, Юникс, Мак преди да пробвате  8)
Даже сега май се сещам че може-би ще стане и с hexdump | grep с опции да ти преброи колко пъти се среща само всяко едно от тези \r, \n, \r\n


П.П.П. Опа малка корекция - мислех че за mc, mcedit, mcview говорим още (при тях НЯМА разлика) - инак да има разлика при (cat -e) ^M, ^M$ и само $
но пък тук проблемът е че не е scriptable щото извътре самия текст може да има и той тези ^M, $ така и те ще влязът в общата бройка...
а бе e/f/grep не може да няма начин да брои и бр. срещания на 1 символ па бил той и бинарен

от мен толкова, че и др. задачи ме чакат...
Колкото ми се удава толкова - дет се вика.
Лек ден колеги.


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: neter в Oct 07, 2012, 21:31
Странно, че mcedit ми дава €М за редовете, които всички останали до тук цитирани начини показваха €М$.
Сигурен съм, че пак ти ги показва като ^M$, но не си обърнал внимание, че следващата дума е на нов ред, което показва, че $ си го има. Ето разделени примери. За ^M
Цитат
едно^Mдве
За ^M$
Цитат
едно^M
две
Има разлика, нали? :)


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: laskov в Oct 07, 2012, 21:54
Всъщност, кое е нужно? Да се знае или да се конвертира? Ако е второто - има инструменти за целта. google знае.


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: go_fire в Oct 07, 2012, 22:00
Нетер разбрах. На най-горния ред ги дава в HEX и така се различават. Понеже не показва $ във вид на символ няма начин да се разбере там ли е или не е, но с това показване най-горе в лентата, се вижда добре.

Ласков, в продължение на предната ми тема, това е документ в установен формат, който се опитвам да редактирам. Обаче един †Господ знае, оттатък, с какво го обработват. Целта ми е да съм сигурен, че съм поставил CRLF, защото ако е друго, не знам, онова нещо ще го възприеме ли.

Иначе вече ми дадоха как да го конвертирам — с jEdit, ако се наложи. Засега си правя експерименти, за да съм сигурен, какво, защо става и да нямам издънка, като се стигне до истинското предаване.


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: dejuren в Oct 07, 2012, 23:51
Дежурен варианта ти е отличен, но не знам, какво да гледам на цат -А. Изкарва ми много неща, явно всичко дето не е латиница излиза зле. Доколкото разбирам ми изкарва съдържанието на файла. Малко трудно се ориентирах. По опит май стигнах до заключение, че нормалните излизат с $, а досовските с ^M$ накрая. Нямам намацан документ да видя те как излизат (би трябвало ^M).

Обаче трябва да намеря начин да видя само крайщата, защото редовете са дълги, излизат твърде неудобно на по няколко реда и е невъзможно да се обхванат с поглед в моя случай.  Ако знам точно колко са дълги редовете (еднакви са), мога ли някак си да изкарам само края им?

Код:
cat -A file | cut -b 14-16 # cut only bytes 14 to 16
^M са два байта, тъй като ги предаваш на cut текстово от предишната команда. По този начин получавам резултат от вида "^M$" - три символа номера 14, 15, 16


Титла: Re: Установяване как завършва реда — \n, \r\n или \r
Публикувано от: Mitaka в Oct 08, 2012, 10:33
Ласков, в продължение на предната ми тема, това е документ в установен формат, който се опитвам да редактирам. Обаче един †Господ знае, оттатък, с какво го обработват. Целта ми е да съм сигурен, че съм поставил CRLF, защото ако е друго, не знам, онова нещо ще го възприеме ли.

Ами ако това е документ, идващ от някакво държавно учреждение, и който трябва да им върнеш - просто го редактирай с каквото трябва. Ако ще под ДОС да е, просто си пусни едно dosemu и готово.
Иначе ще имаш само проблеми с въпросните хиени.
Знам го от опит с банка, на която пратихме документ, правен с Open Office... просто се експортва едно csv, но системата им не го приема и това си е.
В резултат, си купихме MS Office, и проблемите ни спряха.