In einer Datei die enthält - Zeile löschen und unter gleichem Namen speichern

senoyches

Lt. Junior Grade
Registriert
Dez. 2018
Beiträge
367
Hallo zusammen,

ich habe ein Problem mit ein paar Datein, hierzu wollte ich in 3 Schritten arbeiten
Schritt 1 -> kopiere mir alle Datein die einen bestimmten Text enthalten in ein anderes Verzeichnis:kein Problem

Bash:
grep -rl ‘BESTIMMTERTEXT‘ ‘Pfad‘ | xargs cp -t ‘NEUER PFAD‘

scheitern tut es bei an Schritt 2, ich möchte nun alle Datein die einen bestimmten Text enthalten quasi öffnen, die betreffende Zeile löschen, wo der Text vorkommt und unter dem gleichen Namen speichern.

Bei Dr. Google bin ich aber immer nur auf Lösungen mit grep und sed gekommen, in denen ich eine neue Datei erzeuge und diese im Anschluss die alte überschreiben lasse. wäre mir aber bei 30 oder mehr Datein pro Arbeitsschritt zu blöd, diese jedes mal zu manuell in der shell zu überschreiben.

der 3 Schritt das zurückkopieren ist kein Problem, da das doch sehr simpel ist lass ich das mal hier weg.

Hat jemand eine Idee, wie sich das lösen lässt? global für alle kopierten Dateien?
 
Für Leute die mit SED nicht öfter arbeiten ist die Syntax halt total unübrsichtlich, das sonst übliche Format in Linux:
Programm -parameter [unterschiedliche Angaben] wird hier ja komplett auseinander genommen, ich blicke ehrlich gesagt hinter die ganzen slash und backslash arugement noch nicht durch, wann was benutzt wird usw. usf.

Erstes Anwendungsbeispiel bezieht sich aber nur auf eine Datei, ich will alle Datein in dem Ordner nehmen, dabei. Sorry ich bin kein Linux Fachmann, versuche mich nur ein wenig darin einzuarbeiten um grundlegende Dinge besser zu managen.
 
floTTes schrieb:
Dafür kannst du ganz einfach grep --invert-match verwenden.

In Laiensprache ausgedrückt tut dein Befehl ungefähr folgendes:

zeige mir alle Zeilen, auf die meine Parameter nicht zutreffen und dies kann ich dann in die gleiche Datei wieder schreiben?
Muss ich diese manuell angeben oder kann ich auch einfach sagen nimm die gleiche Datei, die du in prinzip gerade geöffnet hast, somit er den Pfad ja eigentlich kennt. So ließe sich dann rekursiv arbeiten.
Ergänzung ()

Sulik schrieb:
Ja sed ist nicht Anfängerfreundlich ;) Du musst einfach bisschen üben und in der Shell zurecht finden.
https://wiki.ubuntuusers.de/Bash/
https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_für_Anfänger/
Wenn du statt einer Datei alle in einem Ordner nehmen willst ist es *
und lern mit regex umzugehen https://wiki.ubuntuusers.de/grep/
Danke, ja das habe ich dann auch nach einigem einlesen gemerkt mit dem *, aber ja SED ist alles andere als Anwenderfreundlich, das benötigt viel Zeit bis ich da dahintersteige, kann dann aber vermutlich sehr viel.

mit SED müsste sowas nach einiger Recherche doch in etwas so gehen:

sed -i '/Suchtext/d‘ /Pfad/zum/Ordner/

oder benötigt es hier auch den *?
 
Zuletzt bearbeitet:
okay, also der Befehl oben klappt super, allerdings habe ich nun Probleme beim ersetzen, ich bin mal ein wenig diese Seite duchgegangen um das ganze besser zu erlernen.

https://www.linux-community.de/ausgaben/linuxuser/2015/08/am-fliessband/1/

leider funktioniert das mit meinem Befehl nicht so gut....

hier ein Beispiel:

sed -i ‘s/{ 94, 102 }/{ 94, 102, 316 }/p‘ temp/testfiles/test.cfg

die Ersetzung funktioniert zwar soweit, allerdings habe ich die Zeichenkette die { 94, 102, 316 } nun 2x direkt untereinander stehen.
 
Hm, warum so kompliziert? Mit grep -v kannst Du alles suchen, was weg soll.
Script
Code:
#!/bin/bash

for datei in `ls /pfad1/*"
do

    grep -v "unnützter Text" ${datei} > /pfad2/${datei}
done
oder als Einzeiler in der Konsole
Code:
for datei in `ls  /pfad1/*`; do grep -v "unnützer Text" ${datei} > /pfad2/${datei}; done
Und Du sparst Dir das kopieren und für Dich kompliziertes sed. ;)
 
  • Gefällt mir
Reaktionen: senoyches und floTTes
Das Kopieren ist mit sed auch unnötig.

PHuV schrieb:
Code:
for datei in `ls  /pfad1/*`; ...; done
Ganz schlechte Idee. :) Da kann ziemlich viel schief gehen: Word splitting, globbing, Dateinamen mit trailing whitespace.

Weniger Zeichen und korrekter:
Code:
for datei in /pfad1/*; ...; done

Edit: Außerdem Expansions wie ${datei} immer quoten: "${datei}".
 
Quoten unter Linux ist an sich unnötig, außer die Dateien kommen von Windows mit Leerzeichen. Ebenso gibts üblicherweise hier ebenso keine Dateinamen mit trailing whitespaces weder per Linux noch Windows,
geschweige den Word splitting. Trailing whitespaces habe ich noch in keiner Datei irgendwo mal gesehen. Man kann es künstlich unter Linux anlegen, aber wer macht sowas? Unter Windows per Explorer ist das unmöglich, unter CMD gehts, aber ebenso die Frage, wer macht sowas?

Aber danke für den Tipp, wußte gar nicht, daß man Liste des Verzeichnisses auch ohne ls einlesen kann. Man sieht, man lernt selbst nach 32 Jahren Unix nicht aus. ;)
 
Vielen dank für die Hilfe, hab mich nebenbei etwas in das SED eingearbeitet und ja man kommt irgendwie dann doch zurecht, aber am Ende des Tages funktionieren beide wege. Wenn ich aber so die komplizierten schreibweisen von SED sehe, dann sehe ich wirklich gar nicht mehr durch.
 
ich weiß, die ursprünglich Frage war eine andere, aber vielleicht kann mir dennoch einer der erfahrenen hier helfen.... Ich habe eine Datei mit einer für Menschen blöd lesbaren Struktur.... z.B.:

Javascript:
{
      "89": [
        0,
        1,
        3,
        13,
        21,
        17, ...... ff
      ]
},

nun würde ich das gerne umwandeln in:
Javascript:
{
      "89": [0, 1, 3, 13, 21, 17, ...... ff ]
},

hat einer eine Idee, wie man das sinnvoll erledigen könnte? Ja sicher geht da was mit SED, aber ich hab noch nix passendes gefunden, vielleicht könnte mich ja jemand drauf stoßen und ich versuche es mir zu erarbeiten. irgendwie den Zeilenumbruch löschen .... bzw. nur damit wäre es ja noch nicht getan.
 
Bei Source Code würde ich um sonstwas Willen bloß nicht mit SED und Co rangehen, dafür nutzt man ein IDE oder das was @andy_m4 vorschlägt. Aber gut, Du wärst nicht der erste, der seinen Sourcecode durch Neuformatierung zerstört. :freak:
 
Wobei es bei Javascript ja noch relativ harmlos ist wenn man sich nur auf Leerzeichen/Tabs stürzt. Zumindest bei Javascript. Versucht man Python-Code so zu formatieren sieht die Sache freilich anders aus. :-)
 
Zurück
Oben