Ausgabe
In meinem aktuellen Verzeichnis habe ich ein paar .txt-Dateien. Ich möchte ein Skript schreiben, um in diesen .txt-Dateien nach einer Zeichenfolge zu suchen und Zeilen zu löschen, die diese Zeichenfolge enthalten. Zum Beispiel möchte ich alle Zeilen löschen, die das Wort “start” in allen .txt-Dateien in meinem aktuellen Verzeichnis enthalten.
Ich habe den folgenden Code geschrieben, aber ich weiß nicht, wie ich fortfahren soll!
#!bin\bash
files=`find . -maxdepth 1 -name \*.txt`
Wie soll ich “while” verwenden, um durch jede Datei zu gehen?
Lösung
Verwenden Sie Globs, um Schleifenvariablen zu füllen
Wenn Sie -maxdepth 1
das aktuelle Verzeichnis verwenden, wechseln Sie nicht in Unterverzeichnisse. Wenn dies der Fall ist, besteht überhaupt keine Notwendigkeit, find zu verwenden, nur um Dateien mit einer Erweiterung abzugleichen. Sie können stattdessen Shell-Globs verwenden, um Ihre Schleifenkonstrukte zu füllen. Zum Beispiel:
#!/bin/bash
# Run sed on each file to delete the line.
for file in *txt; do
sed -i '/text to match/d' "$file"
done
Dies ist einfach und vermeidet eine Reihe von Problemen im Zusammenhang mit Dateinamen, die beim Übergeben von Dateinamenargumenten zwischen Prozessen auftreten können. Halte es einfach!
Beantwortet von – Todd A. Jacobs
Antwort geprüft von – David Marino (FixError Volunteer)