Wie würde ich sed verwenden, um alle Zeilen in einer Textdatei zu löschen, die eine bestimmte Zeichenfolge enthalten?
shell
sed
text-parsing
in-place
Ein Uhrwerk Orange
quelle
quelle
sed '/pattern to match/d' ./infile > ./newfile
oder wenn Sie eine direkte Bearbeitung durchführen möchten, können Sie das-i
Flag wie in sed hinzufügensed -i '/pattern to match/d' ./infile
. Beachten Sie, dass die-i
Flagge GNU sed erfordert und nicht portabel istsed -i.backup '/pattern to match/d' ./infile
) Das hat mich mit direkten Änderungen konfrontiert.sed
auf Dateien an, die nicht versioniert sind.sed -i '' '/pattern/d' ./infile
.Es gibt viele andere Möglichkeiten, Zeilen mit einer bestimmten Zeichenfolge zu löschen
sed
:AWK
Rubin (1,9+)
Perl
Shell (Bash 3.2 und höher)
GNU grep
Und natürlich
sed
(das Drucken der Umkehrung ist schneller als das tatsächliche Löschen):quelle
sed
Beispiel hat ein anderes Verhalten, es greift nur! es sollte so etwas seinsed -n -i '/pattern/!p' file
.grep -v "pattern" file > temp; mv temp file
Dies kann je nach Rückgabewert für einige der anderen Beispiele gelten.seq -f %f 10000000 >foo.txt
. sed d:time sed -i '' '/6543210/d' foo.txt
echte 0m9.294s. sed! p:time sed -i '' -n '/6543210/!p' foo.txt
echte 0m13.671s. (Bei kleineren Dateien ist der Unterschied größer.)Sie können sed verwenden, um Zeilen in einer Datei zu ersetzen. Es scheint jedoch viel langsamer zu sein, als grep für die Umkehrung in eine zweite Datei zu verwenden und dann die zweite Datei über das Original zu verschieben.
z.B
oder
Der erste Befehl dauert auf meinem Computer sowieso dreimal länger.
quelle
sed '/pattern/d' filename > filename2; mv filename2 filename
Der einfache Weg, dies mit GNU zu tun
sed
:quelle
-r
Option (oder-E
, abhängig von Ihrer Version). Dies ermöglicht die Verwendung von Regex Metazeichen+
,?
,{...}
und(...)
.Sie können Folgendes in Betracht ziehen
ex
(dies ist ein standardmäßiger befehlsbasierter Unix-Editor):wo:
+
führt den angegebenen Ex-Befehl (man ex
) aus,-c
der auch ausgeführt wirdwq
(Schreiben und Beenden)g/match/d
- Ex-Befehl zum Löschen von Zeilen mit gegebenemmatch
, siehe: Potenz von gDas obige Beispiel ist eine POSIX-kompatible Methode zum direkten Bearbeiten einer Datei gemäß diesem Beitrag unter Unix.SE- und POSIX-Spezifikationen für
ex
.Der Unterschied zu
sed
ist, dass:Es sei denn, Sie genießen nicht portierbaren Code, E / A-Overhead und einige andere schlimme Nebenwirkungen. Grundsätzlich sind einige Parameter (wie z. B. in-place /
-i
) nicht standardmäßige FreeBSD-Erweiterungen und möglicherweise unter anderen Betriebssystemen nicht verfügbar.quelle
man ex
es gibt mir den Mannvim
, so scheint es ,ex
ist ein Teil von vim ... wenn ich für richtig , dass Mittel , um die Muster - Syntax zu verstehenmatch
ist vimregex.com , die POSIX und PCRE Aromen ähnlich , aber anders ist?:g
ist ein POSIX-kompatibler Befehl mit einigen geringfügigen Unterschieden . Ich gehe davon aus, dass PCRE darauf basiert.Ich hatte auf dem Mac damit zu kämpfen. Außerdem musste ich es mit variablem Ersatz machen.
Also habe ich verwendet:
sed -i '' "/$pattern/d" $file
Wo
$file
ist die Datei, in der das Löschen erforderlich ist, und wo$pattern
ist das Muster, das zum Löschen abgeglichen werden soll?Ich habe das
''
aus diesem Kommentar ausgewählt .Hier ist die Verwendung von doppelten Anführungszeichen in zu beachten
"/$pattern/d"
. Variable funktioniert nicht, wenn wir einfache Anführungszeichen verwenden.quelle
sed
benötigt einen Parameter nach-i
. Wenn Sie also keine Sicherung wünschen, müssen Sie immer noch eine leere Zeichenfolge hinzufügen:-i ''
sed -i "/$pattern/d" $file
. Vielen Dank für Ihre Antwort.Ich habe einen kleinen Benchmark mit einer Datei erstellt, die ungefähr 345 000 Zeilen enthält. Der Weg mit
grep
scheintsed
in diesem Fall etwa 15-mal schneller zu sein als die Methode.Ich habe sowohl mit als auch ohne die Einstellung LC_ALL = C versucht, es scheint die Timings nicht wesentlich zu ändern. Die Suchzeichenfolge (CDGA_00004.pdbqt.gz.tar) befindet sich irgendwo in der Mitte der Datei.
Hier sind die Befehle und die Timings:
quelle
Sie können dies auch verwenden:
Hier
-v
wird nur ein anderes Muster als Ihr Muster gedruckt (dies bedeutet, dass die Übereinstimmung umgekehrt wird).quelle
Um ein inplace-ähnliches Ergebnis zu erzielen
grep
, können Sie Folgendes tun:quelle
bash
Shell oder ähnliches (nichttcsh
).SED:
'/James\|John/d'
-n '/James\|John/!p'
AWK:
'!/James|John/'
/James|John/ {next;} {print}
GREP:
-v 'James\|John'
quelle
Der erste Befehl bearbeitet die Datei (en) an Ort und Stelle (-i).
Der zweite Befehl macht dasselbe, behält jedoch eine Kopie oder Sicherung der Originaldatei (en) bei, indem .bk zu den Dateinamen hinzugefügt wird (.bk kann in irgendetwas geändert werden).
quelle
echo -e "/thing_to_delete\ndd\033:x\n" | vim file_to_edit.txt
quelle
Nur für den Fall, dass jemand dies für genaue Übereinstimmungen von Zeichenfolgen tun möchte, können Sie das
-w
Flag in grep - w für das Ganze verwenden. Das heißt, wenn Sie beispielsweise die Zeilen mit der Nummer 11 löschen möchten, aber die Zeilen mit der Nummer 111 beibehalten möchten:Es funktioniert auch mit dem
-f
Flag, wenn Sie mehrere exakte Muster gleichzeitig ausschließen möchten. Wenn "Blacklist" eine Datei mit mehreren Mustern in jeder Zeile ist, die Sie aus "Datei" löschen möchten:quelle
-w, --word-regexp Select only those lines containing matches that form whole words.
vs.-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
quelle
um den behandelten Text in der Konsole anzuzeigen
um behandelten Text in einer Datei zu speichern
behandelte Textinformationen an eine vorhandene Datei anhängen
Um bereits behandelten Text zu behandeln, entfernen Sie in diesem Fall mehr Zeilen von dem, was entfernt wurde
Das
| more
wird Text in Blöcken von jeweils einer Seite anzeigen.quelle
Sie können gute alte verwenden
ed
in ähnlicher Weise , um eine Datei zu bearbeiten die Antwort , dass Anwendungenex
. Der große Unterschied in diesem Fall besteht darin, dassed
die Befehle über die Standardeingabe und nicht als Befehlszeilenargumente wieex
can verwendet werden. Wenn Sie es in einem Skript verwenden, können Sie dies normalerweise verwenden, indem Sieprintf
Befehle an das Skript weiterleiten :oder mit einem Heredoc:
quelle