In einer Datei mit vielen Zeilen möchte ich Zeilen löschen, die mit beginnen HERE IT IS
.
Wie kann ich das nur mit Befehlszeilentools tun?
command-line
text-processing
micgeronimo
quelle
quelle
vim
wievim '+g/^HERE IT IS/d' +wq test.txt
Antworten:
Versuchen
sed
:WARNUNG: Es ist besser, eine Sicherungskopie zu erstellen, wenn Sie
-i
switch of verwendensed
:Die Originaldatei bleibt unverändert,
<file>.bak
und die geänderte Datei bleibt unverändert<file>
.quelle
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
sed '/^HERE IT IS/G' file
.Neben der sehr guten
grep
undsed
Antworten , die Sie erhalten haben, sind hier einige andere Tools , die das gleiche tun können:Einige Perl-Möglichkeiten:
Sie können den
-i
Schalter zu jedem Beispiel hinzufügen , um die Datei direkt zu bearbeiten:(gaffen
Neuere Versionen (4.1.1 und höher) von GNU
awk
(der Standardawk
unter Linux) können die Datei auch direkt bearbeiten:Shell (
bash
,zsh
,ksh
, wahrscheinlich noch andere). Dies ist eine Art albern aber es können aber auch andere Werkzeuge sind besser gemacht werden.quelle
bash
eine hat mich zum LOL gemacht)printf "%s\n" "$line"
: Zitieren von $ line, um Leerzeichen zu erhalten, und Vermeiden von Echoproblemen (Interpretieren von Sonderzeichen usw.). und vermeidet die Notwendigkeit, auch hinzuzufügen--
.IFS=
und-r
, kann ich genauso gut den ganzen Weg gehen und es robust machen.ich würde ... benutzen
grep
, um sie herauszufiltern. Zum Beispiel :Verschieben Sie dann die Ausgangsdatei zurück in die Infile-Datei.
quelle
sed
ist definitiv der richtige Weg.Durch diese geringfügige Änderung des Befehls @heemayl wird die Zeile gelöscht, unabhängig davon, ob im Muster die gleiche Groß- / Kleinschreibung verwendet wird oder nicht.
Wenn Sie mehrere Dateien in einem Verzeichnis haben, in dem Sie dies tun möchten, können Sie es mit find like so kombinieren.
Die Option maxdepth bedeutet, dass dies nicht in Verzeichnisse wiederkehrt.
quelle
Eine weitere Python-Option:
Wobei f der Pfad zur Datei zwischen Anführungszeichen ist.
quelle
Grep
(?!HERE IT IS)
Negative Lookahead-Behauptung, die bewirkt, dass die Regex-Engine nur dann mit der gesamten Zeilenstartgrenze übereinstimmt^
( die normalerweise von übereinstimmt ), wenn die Zeichenfolge nicht folgtHERE IT IS
Python
Speichern Sie das Skript beispielsweise in einer Datei
script.py
und führen Sie es dann über den folgenden Befehl auf dem Terminal aus.quelle
[print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)]
, aber es ist nicht viel effizienter alsstartswith
. Ich habe mich gefragt, wie[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
ich die Ausgabe in einer Liste nicht erzeugen kann.Sie können Vim im Ex-Modus verwenden:
g
globale Suched
löschenx
speichern und schließenquelle