Alle LF finden mit grep, perl ...

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
wartburgritter
Beiträge: 269
Registriert: 01.10.2005 16:45:42
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Winterthur, selten auch Eisenach

Alle LF finden mit grep, perl ...

Beitrag von wartburgritter » 03.09.2014 20:03:18

Hallo zusammen, bin ein wenig am verzweifeln. Suche und probiere seit 2 Stunden

folgendes findet mir alle Zeilen in allen Dateien unterhalb des aktuellen Verzeichnes in denen irgendeinstringohneleerzeichen vorkommt.

$ grep -r irgendeinstringohneleerzeichen

Ich versuche genau dies für LineFeeds zu machen. Ich will sie nicht ersetzten, und will nur wissen welche Dateien welche haben. Arbeite an einem Projekt mit, bei dem alle Zeilenumbrüche mit CRLF sind, aber es hat zwischendurch einige mit LF. Ich würd gern diese mal anzeigen.

gruss bernd
Stand März 2020:
Desktop Lenovo ThinkPad X1 mit Debian Buster (super kiste, aber der akku macht nach nunmehr 3 Jahren schlapp)
Fileserver veralte hardware mit neuer grosser hd mit Debian Lenny (ich sollte den wirklich mal ersetzen ... )
Mobiltelefon Sony Xperia mit SailfishOS
Tablet BQ aquaris M10 mit Ubuntu Touch

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Alle LF finden mit grep, perl ...

Beitrag von Meillo » 03.09.2014 22:01:18

wartburgritter hat geschrieben: Ich versuche genau dies für LineFeeds zu machen. Ich will sie nicht ersetzten, und will nur wissen welche Dateien welche haben.
Du findest sie ganz einfach mit:

Code: Alles auswählen

grep \$
;-)

(Jede nicht-leere nicht-binaere Datei in Unix sollte mindestens einen LF (im Unix-Jargon ``Newline'') haben.)

Arbeite an einem Projekt mit, bei dem alle Zeilenumbrüche mit CRLF sind, aber es hat zwischendurch einige mit LF. Ich würd gern diese mal anzeigen.
Alle Dateien mit CRLF findest du so:

Code: Alles auswählen

grep '^M$'
Alle anderen Textdateien sind dann wohl diejenigen die du suchst.

Vielleicht hilft dir dabei auch unix2dos:
https://en.wikipedia.org/wiki/Unix2dos
Use ed once in a while!

wartburgritter
Beiträge: 269
Registriert: 01.10.2005 16:45:42
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Winterthur, selten auch Eisenach

Re: Alle LF finden mit grep, perl ...

Beitrag von wartburgritter » 04.09.2014 12:50:16

Besten Dank für die Antwort.
Meillo hat geschrieben: Alle Dateien mit CRLF findest du so:

Code: Alles auswählen

grep '^M$'
findet bei mir nichts

Die Invertierung

Code: Alles auswählen

grep -v '^M$'
findet wieder alle Zeilenumbrüche

Code: Alles auswählen

grep \$
Findet richtigerweise alle Zeilenumbrüche egal ob LF oder CRLF.

Ach in vi lassen sich die Zeilenumbrüche darstellen, dazu einfach die datei im unix-format öffnen, das heisst die CR werden als ^M angezeit und LF gar nicht

Code: Alles auswählen

:e ++ff=unix
Mhh, genau so gings mir x-Sachen schon probiert nichts hat bisher geklappt ...

gruss bernd alias der wartburgitter

EDIT
Testdatei unter http://www.b75.ch/download/LineFeedTest.zip. Musste es zippen sonst ändert der Server oder wer auch immer wieder die Zeilenumbrüche. Vor den Zeilenumbrüchen steht was es für einen Zeilenumbruch hat.
Stand März 2020:
Desktop Lenovo ThinkPad X1 mit Debian Buster (super kiste, aber der akku macht nach nunmehr 3 Jahren schlapp)
Fileserver veralte hardware mit neuer grosser hd mit Debian Lenny (ich sollte den wirklich mal ersetzen ... )
Mobiltelefon Sony Xperia mit SailfishOS
Tablet BQ aquaris M10 mit Ubuntu Touch

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Alle LF finden mit grep, perl ...

Beitrag von linuxCowboy » 04.09.2014 14:10:48

wartburgritter hat geschrieben:
Meillo hat geschrieben: Alle Dateien mit CRLF findest du so:

Code: Alles auswählen

grep '^M$'
findet bei mir nichts
'^M$' meint hier C-v Enter. (' Control+v Enter $ ')

du suchst also:

Code: Alles auswählen

grep -v '^M$' LineFeedTest.txt # literal
LF
LF
LF
LF
LF
es geht auch:

Code: Alles auswählen

grep -vP '\xd$' 
-der_linux_cowboy --- Besser werden! ... f*** w$$

wartburgritter
Beiträge: 269
Registriert: 01.10.2005 16:45:42
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Winterthur, selten auch Eisenach

Re: Alle LF finden mit grep, perl ...

Beitrag von wartburgritter » 04.09.2014 15:28:04

linuxCowboy hat geschrieben: '^M$' meint hier C-v Enter. (' Control+v Enter $ ')
Vielen Vielen Dank funktioniert hier auch :-), kannst evtl. ne kleine Erklärung geben wo das herkommt oder link schicken? Auf "Ctrl + v + Enter" wäre ich jetzt im Leben nie gekommen ?! Da hab ich ne Wissenslücke.

gruss bernd der wartburgritter
Stand März 2020:
Desktop Lenovo ThinkPad X1 mit Debian Buster (super kiste, aber der akku macht nach nunmehr 3 Jahren schlapp)
Fileserver veralte hardware mit neuer grosser hd mit Debian Lenny (ich sollte den wirklich mal ersetzen ... )
Mobiltelefon Sony Xperia mit SailfishOS
Tablet BQ aquaris M10 mit Ubuntu Touch

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Alle LF finden mit grep, perl ...

Beitrag von linuxCowboy » 04.09.2014 20:37:38

Das ist ein bash readline command.

Code: Alles auswählen

bind -q quoted-insert
quoted-insert can be invoked via "\C-q", "\C-v".
Infos: help bind

Code: Alles auswählen

quoted-insert (C-q, C-v)
    Add the next character typed to the line verbatim.  This is how to insert characters like C-q, for example.
Infos: man bash

Den Steuercode erzeugst du mit Control und dem entsprechenden Buchstaben im Alphabet.

A=1, B=2,... J=10=0A,... M=13=0D=Enter,...

Grüße,
-der_linux_cowboy --- Besser werden! ... f*** w$$

wartburgritter
Beiträge: 269
Registriert: 01.10.2005 16:45:42
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Winterthur, selten auch Eisenach

Re: Alle LF finden mit grep, perl ...

Beitrag von wartburgritter » 04.09.2014 22:01:16

Danke für die Info :)
Stand März 2020:
Desktop Lenovo ThinkPad X1 mit Debian Buster (super kiste, aber der akku macht nach nunmehr 3 Jahren schlapp)
Fileserver veralte hardware mit neuer grosser hd mit Debian Lenny (ich sollte den wirklich mal ersetzen ... )
Mobiltelefon Sony Xperia mit SailfishOS
Tablet BQ aquaris M10 mit Ubuntu Touch

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: Alle LF finden mit grep, perl ...

Beitrag von newdeb » 05.09.2014 07:06:36

Du kannst auch nach dem literalen '^M' greppen, wenn du ein cat -v Filter vorweg stellst :)

Code: Alles auswählen

cat -v test.txt | grep '\^M$'
AAA^M
BBB^M
CCC^M

wartburgritter
Beiträge: 269
Registriert: 01.10.2005 16:45:42
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Winterthur, selten auch Eisenach

Re: Alle LF finden mit grep, perl ...

Beitrag von wartburgritter » 07.01.2016 07:25:19

linuxCowboy hat geschrieben: es geht auch:

Code: Alles auswählen

grep -vP '\xd$' 
Obiges findet hier seit monaten zeilen perfekt zeilen mit unix line endings (lf). Weiss jemand wie das kommando für windows line endings (cr lf) und osx line endings lautet?
Stand März 2020:
Desktop Lenovo ThinkPad X1 mit Debian Buster (super kiste, aber der akku macht nach nunmehr 3 Jahren schlapp)
Fileserver veralte hardware mit neuer grosser hd mit Debian Lenny (ich sollte den wirklich mal ersetzen ... )
Mobiltelefon Sony Xperia mit SailfishOS
Tablet BQ aquaris M10 mit Ubuntu Touch

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Alle LF finden mit grep, perl ...

Beitrag von Meillo » 07.01.2016 09:54:49

wartburgritter hat geschrieben:
linuxCowboy hat geschrieben: es geht auch:

Code: Alles auswählen

grep -vP '\xd$' 
Obiges findet hier seit monaten zeilen perfekt zeilen mit unix line endings (lf). Weiss jemand wie das kommando für windows line endings (cr lf) und osx line endings lautet?
LOL, die Frage ist echt zu lustig, wenn man verstanden hat, was das Kommando macht! :-D

Aber gute Witze zu erklaeren macht irgendwie keinen rechten Spass ...


(Tipp: Die Manpage zu grep(1) koennte im Bezug auf die Flags weiterhelfen.)
Use ed once in a while!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Alle LF finden mit grep, perl ...

Beitrag von eggy » 07.01.2016 13:48:01

Falls Ihr git benutzt, lies mal den Abschnitt "Formatierungen und Leerzeichen",
(core.autocrlf sagt git wie es mit "Windowszeilenenden" umgehen soll):
https://git-scm.com/book/de/v1/Git-indi ... figuration

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Alle LF finden mit grep, perl ...

Beitrag von Meillo » 07.01.2016 16:16:43

wartburgritter hat geschrieben:
linuxCowboy hat geschrieben: es geht auch:

Code: Alles auswählen

grep -vP '\xd$' 
Obiges findet hier seit monaten zeilen perfekt zeilen mit unix line endings (lf). Weiss jemand wie das kommando für windows line endings (cr lf) und osx line endings lautet?
Okay, jetzt nochmal konstruktiv:

Das von dir gepostete Kommando sucht tatsaechlich Windowszeilenumbrueche und invertiert dann (mittels `-v') das Ergebnis, wodurch du alle nicht-Windows-Umbrueche ausgegeben bekommst, und das sind wiederum die Unix-Umbrueche. Wenn du nun die Zeilen mit Windows-Umbruch haben willst, dann musst du nur das `v' in dieser Zeile entfernen! (Das ist halt wie wenn man fragt, wie man den Absolutbetrag von `-15' herausfindet.)

MacOS X Zeilenenden sind die gleichen wie die von Unix, weil das MacOS mit dem `X' auf Unix basiert. Meinen tust du wohl eher alte MacOS-Zeilenenden, die nur aus `\r' bestehen. Ich habe damit keine Praxiserfahrung gesammelt, vermute jedoch, dass die aus Unix-Sicht nicht als Zeilentrenner angesehen werden und du deshalb (Unix-)zeilenorientierte Tools wie grep(1) nicht dafuer verwenden kannst.
Use ed once in a while!

wartburgritter
Beiträge: 269
Registriert: 01.10.2005 16:45:42
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Winterthur, selten auch Eisenach

Re: Alle LF finden mit grep, perl ...

Beitrag von wartburgritter » 15.07.2016 09:51:50

@Meillo:

danke für die Erläuterungen.

gruss bernd alias der wartburgritter
Stand März 2020:
Desktop Lenovo ThinkPad X1 mit Debian Buster (super kiste, aber der akku macht nach nunmehr 3 Jahren schlapp)
Fileserver veralte hardware mit neuer grosser hd mit Debian Lenny (ich sollte den wirklich mal ersetzen ... )
Mobiltelefon Sony Xperia mit SailfishOS
Tablet BQ aquaris M10 mit Ubuntu Touch

cosmac
Beiträge: 4573
Registriert: 28.03.2005 22:24:30

Re: Alle LF finden mit grep, perl ...

Beitrag von cosmac » 16.07.2016 18:58:29

Meillo hat geschrieben:MacOS X Zeilenenden sind die gleichen wie die von Unix, weil das MacOS mit dem `X' auf Unix basiert. Meinen tust du wohl eher alte MacOS-Zeilenenden, die nur aus `\r' bestehen. Ich habe damit keine Praxiserfahrung gesammelt, vermute jedoch, dass die aus Unix-Sicht nicht als Zeilentrenner angesehen werden und du deshalb (Unix-)zeilenorientierte Tools wie grep(1) nicht dafuer verwenden kannst.
Witzig, das ist echt nicht wirklich vorgesehen. Wir basteln uns ein MacOS (File):

Code: Alles auswählen

cosmac@turtur:/tmp$ echo -e -n 'blog.fefe.de\rimgur.com\rdf.de\r' > foo
cosmac@turtur:/tmp$ file foo
foo: ASCII text, with CR line terminators
cosmac@turtur:/tmp$ more foo
df.de.com.de
cosmac@turtur:/tmp$ cat foo
cosmac@turtur:/tmp$ view foo

blog.fefe.de^Mimgur.com^Mdf.de^M

"foo" [noeol] 1L, 29C
~
Beware of programmers who carry screwdrivers.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Alle LF finden mit grep, perl ...

Beitrag von Meillo » 16.07.2016 19:49:09

cosmac hat geschrieben: Witzig, das ist echt nicht wirklich vorgesehen. Wir basteln uns ein MacOS (File):
Warum auch? In Unix ist das Newline-Zeichen der Zeilentrenner ... warum haette man dort Kompatibilitaetscode fuer eine anderen Art von Zeilentrenner einbauen sollen, deren Betriebssystem erst mehr als zehn Jahre spaeter entwicklet worden ist?

Viel seltsamer ist, dass Mac OS nicht auch das Newline-Zeichen verwendet hat ... und ebenso seltsam ist, dass DOS die CRLF-Kombination verwendet, wo es in seiner Kultur im Vergleich zu Unix viel weiter weg ist von Typewritern, auf die diese Kombination gruendet.
Use ed once in a while!

cosmac
Beiträge: 4573
Registriert: 28.03.2005 22:24:30

Re: Alle LF finden mit grep, perl ...

Beitrag von cosmac » 16.07.2016 22:04:32

Meillo hat geschrieben:In Unix ist das Newline-Zeichen der Zeilentrenner ... warum haette man dort Kompatibilitaetscode fuer eine anderen Art von Zeilentrenner einbauen sollen, deren Betriebssystem erst mehr als zehn Jahre spaeter entwicklet worden ist?
Weil es Unix ist 8) Die zehn Jahre sind natürlich ein kleines Problem...
Meillo hat geschrieben:ebenso seltsam ist, dass DOS die CRLF-Kombination verwendet, wo es in seiner Kultur im Vergleich zu Unix viel weiter weg ist von Typewritern, auf die diese Kombination gruendet.
Vielleicht war das keine bewusste Entscheidung, man hat den ASCII Code übernommen und da ist es eben so Typewriter-mäßig definiert. Die Kombination ist aber auch für Textkonsolen aus Glas praktisch, man braucht ja beide Funktionen einzeln.
Beware of programmers who carry screwdrivers.

Antworten