ubuntuusers.de

sed: von Zeilenanfang bis zu bestimmten Muster löschen

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

Nooster Team-Icon

Avatar von Nooster

Anmeldungsdatum:
17. Juni 2008

Beiträge: 920

Hallo!

Ich möchte in einem Textdokument alle Zeichen vom Zeilenanfang bis zur Buchstabenkombination http:// löschen, also aus

">2010-11-20 15:06:52 http://www.example.com/cam2/2572-20101120150651-01.jpg
">2010-11-20 15:06:51 http://www.example.com/2572-20101120150651-00.jpg
">2010-11-20 15:06:51 http://www.example.com/2572-20101120150650-01.jpg

soll das werden

http://www.example.com/2572-20101120150651-01.jpg
http://www.example.com/2572-20101120150651-00.jpg
http://www.example.com/2572-20101120150650-01.jpg

Wie geht das? Ich habe zwar eine sehr umfangreiche Auflistung von sed-Befehlen gefunden, allerdings hilft sie mir nicht weiter: http://sed.sourceforge.net/sed1line_de.html

Liebe Grüße, Nooster

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

quick'n'dirty ohne sed:

for i in $(cat file.txt); do echo $i| grep http; done > cleaned_file.txt

John_W

Anmeldungsdatum:
10. Juli 2010

Beiträge: 571

sed 's#^.*http://##' datei

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

John W schrieb:

sed 's#^.*http://##' datei

das killt dir auch die http://

John_W

Anmeldungsdatum:
10. Juli 2010

Beiträge: 571

Dann mach doch wieder rein...

sed 's#^.*http://#http://#' datei

oder noch anders:

sed -r 's#^.*(http://)#\1#' datei

Deins macht jedenfalls nix dergleichen...

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Das geht schon mit beiden Befehlen ...

Mit grep:

grep -o "http://.*"  "$dein_textdokument"  >  "$dein_neues_dokument"

- der Parameter "-o" sorgt dafür dass nur der gematchte Ausdruck erscheint.

Und mit sed:

sed -i  's#^.*\(http://\)#\1#'  "$dein_textdokument"

- durch den Parameter "-i" erfolgt die Änderung direkt in Deinem Original-Dokument (bei dem üblichen Gnu sed).

LG,

track

Nooster Team-Icon

(Themenstarter)
Avatar von Nooster

Anmeldungsdatum:
17. Juni 2008

Beiträge: 920

Danke euch, der grep-Befehl funktioniert und erfüllt meine Wünsche!

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

John W schrieb:

Deins macht jedenfalls nix dergleichen...

Meins macht nix dergleichen? soso...

antiqua@fegyptine ~/ubuntu/text % cat file.txt
">2010-11-20 15:06:52 http://www.example.com/cam2/2572-20101120150651-01.jpg
">2010-11-20 15:06:52 http://www.example.com/cam2/2572-20101120150651-01.jpg
">2010-11-20 15:06:51 http://www.example.com/2572-20101120150651-00.jpg
">2010-11-20 15:06:51 http://www.example.com/2572-20101120150651-00.jpg
">2010-11-20 15:06:51 http://www.example.com/2572-20101120150650-01.jpg
">2010-11-20 15:06:51 http://www.example.com/2572-20101120150650-01.jpg
">2010-11-20 15:06:52 http://www.example.com/cam2/2572-20101120150651-01.jpg
">2010-11-20 15:06:51 http://www.example.com/2572-20101120150651-00.jpg
">2010-11-20 15:06:51 http://www.example.com/2572-20101120150650-01.jpg
antiqua@fegyptine ~/ubuntu/text % for i in $(cat file.txt); do echo $i| grep http; done > cleanedfile.txt
antiqua@fegyptine ~/ubuntu/text % cat cleanedfile.txt
http://www.example.com/cam2/2572-20101120150651-01.jpg
http://www.example.com/cam2/2572-20101120150651-01.jpg
http://www.example.com/2572-20101120150651-00.jpg
http://www.example.com/2572-20101120150651-00.jpg
http://www.example.com/2572-20101120150650-01.jpg
http://www.example.com/2572-20101120150650-01.jpg
http://www.example.com/cam2/2572-20101120150651-01.jpg
http://www.example.com/2572-20101120150651-00.jpg
http://www.example.com/2572-20101120150650-01.jpg
antiqua@fegyptine ~/ubuntu/text %                         

is zwar umständlich, macht aber was es soll.

John_W

Anmeldungsdatum:
10. Juli 2010

Beiträge: 571

Ach, sorry, ich hatte das nicht getestet und vergessen, dass die Leerzeichen zu einem neuen Durchlauf führen. Also gut, es funktioniert - aber bei vielen Zeilen wird das lange dauern.

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

deshalb schrub ich ja "quick'n'dirty". 😉

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Antiqua:
Auch wenn Deine Version hier scheinbar funktionierte, so sind da doch 2 ganz tückische Fehler drin:

  • mit dem for i in $(cat file.txt) (ohne "Quotes") zerlegst Du jede Zeile bei den Leerzeichen in Worte und suchst dann das Wort mit "http" drin heraus.
    Das funktioniert hier zufällig, aber wehe, wenn im Dateinamen auch nur ein Leerzeichen vorkommt !
    (und es ist heimlich eine andere Trennbedingung als sie sein sollte)

  • Du hast auch $i nicht gequotet ... das allein geht schief, sobald ein [Tab], ein [CR] oder Blanks im Dateinamen vorkommen.

Beides ist nicht gut. "Wieso, es geht doch" ist hier ein schlechtes Argument.
Sonst verteilst Du nämlich schon mal kleine Bömbchen, ohne es zu merken ... 😉

LG,

track

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

track schrieb:

Antiqua:
Auch wenn Deine Version hier scheinbar funktionierte, ...

die funktioniert hier nicht nur scheinbar. Bei dem gegebenen Beispiel funktioniert die. 😉

... so sind da doch 2 ganz tückische Fehler drin:

  • mit dem for i in $(cat file.txt) (ohne "Quotes") zerlegst Du jede Zeile bei den Leerzeichen in Worte und suchst dann das Wort mit "http" drin heraus.

richtig und bei dem gegebenen Beispiel geht das und es ist bei dem gegebenen Beispiel kein Fehler. Wärs ein Fehler würde es bei dem gegebenen Beispiel nicht funktionieren.

Es ist nicht schön, es ist umständlich und es funktioniert nicht bei anderen Beispielen... 😉

Das funktioniert hier zufällig, aber wehe, wenn im Dateinamen auch nur ein Leerzeichen vorkommt !
(und es ist heimlich eine andere Trennbedingung als sie sein sollte)

die funktioniert hier nicht nur zufällig. Bei dem gegebenen Beispiel (alles ohne Leerzeichen) funktioniert die. 😉

  • Du hast auch $i nicht gequotet ... das allein geht schief, sobald ein [Tab], ein [CR] oder Blanks im Dateinamen vorkommen.

das geht hier™ nicht schief. Bei dem gegebenen Beispiel (ohne Blanks, Tab oder Carriage Return) funktioniert das. 😉

Beides ist nicht gut. "Wieso, es geht doch" ist hier ein schlechtes Argument.

nö, bei dem gegebenen Beispiel funktioniert das. Das es nicht toll ist, weiß ich. Das es nicht funktioniert mit Blanks, Tabs, etc in der Url ist mir auch bewusst. Rate mal, wieso ich ausdrücklich quick'n'dirty schrub...

Sonst verteilst Du nämlich schon mal kleine Bömbchen, ohne es zu merken ... 😉

Mir war das, was du bemängelst, durchaus bewußt. Deshalb hab ich mir ja auch genau das gegebene Beispiel angeschaut... und was soll ich sagen... bei dem gegebenen Beispiel funktioniert das 😉

Ich hab nie und nirgens behauptet, das es die Universlformel für alle möglichen Arten von Files mit Zeilen, die irgendwelche Urls enthalten, sei. Ich behaupte nur (und dabei bleibe ich bis zum Beweis des Gegenteils, was schwierig wird, weil es bei dem gegebenen Beispiel ja funktioniert), daß es bei dem gegebenen Beispiel funktioniert.

😉

LG:
Antiqua

John_W

Anmeldungsdatum:
10. Juli 2010

Beiträge: 571

Kann den mal wer erschie^Wind den Hintern treten? 😈

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

John W schrieb:

Kann den mal wer erschie^Wind den Hintern treten? 😈

bei Hinweisen auf die eigene Unzulänglichkeit mit Aggressionen reagieren... soso... 😎

John_W

Anmeldungsdatum:
10. Juli 2010

Beiträge: 571

Wieso eigene Unzulänglichkeit? Meine Lösung passt auf mehr als nur das Beispiel, ist sicherer und schneller.

Deine Methode ("das passt gerade so aufs Beispiel, ist also richtig") führt, wenn man das dauerhaft auch nur halbwegs konsequent umsetzt, zu Problemen.

Antworten |