2016-08-23 4 views
0

Ich möchte bestimmten Text in einem Verzeichnis suchen, und löschen Sie dann die Zeilen aus den Dateien, die den spezifischen Text enthalten.finden Sie bestimmten Text in einem Verzeichnis und löschen Sie die Zeilen aus den Dateien

Jetzt habe ich zwei Fragen:

  1. Wie kann ich die Aufgabe erreichen?
  2. Was ist los mit Was ich versucht habe? Ich habe die folgenden Methoden ausprobiert, aber gescheitert. die Details sind folgende:

    grep -rnw "./" -e "webdesign"

    Dies das aktuelle Verzeichnis mit Muster „webdesign“ sucht, und ich bekomme das Ergebnis:

     
    .//pages/index.html:1:{% load webdesign %} 
    .//pages/pricing.html:1:{% load webdesign %} 
    .//prototypes.py:16:  'django.contrib.webdesign', 
    

    Dann benutze ich sed die Linien aus diesen Dateien zu entfernen, die doesn ‚t Arbeit, bekommt nur leere Datei (ich meine es alle meinen Dateiinhalt löscht):

     
    sed -i "/webdesign/d" ./pages/index.html 
    or 
    sed "/webdesign/d" ./pages/index.html > ./pages/index.html 
    

Meine Software environ ment ist: OS X Yosemite, Mac Terminal Bash

+0

'sed -i"/webdesign/d "./Pages/index.html sollte genau das tun, was Sie wollen. –

+0

@ Jean-FrançoisFabre: Macs 'sed' unterstützt' -i' nicht. – choroba

+0

Der Befehl erhält nur den leeren Inhalt in meiner Datei. @ Jean-FrançoisFabre – soarinblue

Antwort

1

in bash Eine Schleife der Trick zur Verfügung gestellt werden kann, dass es keine Dateinamen mit Leerzeichen sind (in diesem Fall andere Lösungen möglich sind, aber dies ist die einfachste)

for i in `grep -lrnw "yourdirectory/" -e "webdesign"` 
do 
    sed "/webdesign/d" $i > $i.tmp 
    # safety to avoid destroying the file if problem arises (disk full?) 
    if [ $? = 0 ] ; then 
     mv -f $i.tmp $i 
    fi 
done 

beachten Sie, dass Sie sollten dieses Skript im aktuellen Verzeichnis nicht gefunden werden, weil es webdesign enthält, und es wird auch geändert werden :)

Dank choroba, ich weiß, dass -i Option funktioniert nicht wie gewünscht. Aber es hat eine andere Bedeutung oder es würde vom opt-Parser zurückgewiesen werden. Es hat etwas mit Suffixen zu tun, nun, es ist jetzt egal, aber es ist schwierig das Problem zuerst zu sehen. Ohne -i können Sie nicht direkt an einer Datei arbeiten. Und das Umleiten der Ausgabe an den Eingang zerstört nur die Eingabedatei (!). Deshalb hat Ihre Lösung nicht funktioniert.

+0

Ihre Lösung macht die Arbeit. Aber meins nicht, warum? – soarinblue

1

Sie können GNU sed installieren, die die -i Option unterstützt, dann

sed -i '/webdesign/d' files 

funktionieren sollte. Beachten Sie, dass es sicherer ist, -i~ zu verwenden, um eine Sicherung zu erstellen.

Sie können nicht auf die gleiche Datei schreiben aus Sie gerade lesen, deshalb

sed /webdesign/d file > file 

nicht funktioniert (es überschreibt die Datei, bevor Sie etwas von ihm lesen kann). Erstellen Sie eine temporäre Datei

sed /webdesign/d file > file.tmp 
mv file.tmp file 
+0

Genauer gesagt, in 'foo file> file' erfolgt die Ausgabeumleitung durch die Shell, die zuerst' file' zum Schreiben öffnet, dann 'foo file' mit stdout umleitet, um zu der zuvor geöffneten Datei umgeleitet zu werden.Wenn 'Datei' zum Schreiben geöffnet wird, werden alle vorhandenen Inhalte entfernt, so dass sie bereits leer ist, wenn' foo' gestartet wird. – melpomene

+0

Ich habe es versucht, und das löst meine zweite Frage. Danke vielmals! @choroba. – soarinblue

Verwandte Themen