Frage Löschen Sie Zeilen in einer Textdatei, die eine bestimmte Zeichenfolge enthalten


Wie würde ich sed verwenden, um alle Zeilen in einer Textdatei zu löschen, die eine bestimmte Zeichenfolge enthalten?


1319
2018-03-23 19:46


Ursprung


Antworten:


Um die Linie zu entfernen und die Ausgabe nach Standard auszudrucken:

sed '/pattern to match/d' ./infile

Um die Datei direkt zu ändern:

sed -i '/pattern to match/d' ./infile

Um die Datei direkt zu ändern (und ein Backup zu erstellen):

sed -i.bak '/pattern to match/d' ./infile

Für Mac OS X Benutzer:

sed -i '' '/pattern/d' ./infile

1978
2018-03-23 19:48



Es gibt viele andere Möglichkeiten, um Zeilen mit einer bestimmten Zeichenkette zu löschen sed

awk

awk '!/pattern/' file > temp && mv temp file

Rubin (1.9+)

ruby -i.bak -ne 'print if not /test/' file

Perl

perl -ni.bak -e "print unless /pattern/" file

Shell (bash3.2 +)

while read -r line
do
  [[ ! $line =~ pattern ]] && echo "$line"
done <file > o 
mv o file

GNU Grep

grep -v "pattern" file > temp && mv temp file

und natürlich sed (Das Drucken der Umkehrung ist schneller als das tatsächliche Löschen.)

sed -n '/pattern/!p' file 

523
2018-03-23 23:57



Sie können mit sed Zeilen in einer Datei 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 bewegen.

z.B.

sed -i '/pattern/d' filename      

oder

grep -v "pattern" filename > filename2; mv filename2 filename

Der erste Befehl dauert sowieso 3 mal länger auf meiner Maschine.


187
2017-11-02 02:37



Der einfache Weg dazu, mit GNU sed:

sed --in-place '/some string here/d' yourfile

51
2018-01-02 17:56



Sie können in Betracht ziehen ex (was ein standardmäßiger UNIX-Befehl-basierter Editor ist):

ex +g/match/d -cwq file

woher:

  • + führt gegebenen Ex-Befehl (man ex), gleich wie -c was ausführt wq (schreiben und beenden)
  • g/match/d - Ex-Befehl zum Löschen von Zeilen mit gegeben match, sehen: Macht von g

Das obige Beispiel ist eine POSIX-kompatible Methode zum direkten Editieren einer Datei Beitrag bei Unix.SE und POSIX Spezifikationen für ex.


Der Unterschied mit sed ist das:

sed ist ein STream EDitor, kein Dateieditor.BashFAQ

es sei denn, Sie genießen unportablen Code, I / O Overhead und einige andere schlechte Nebenwirkungen. Also im Grunde einige Parameter (wie in-Place /-i) sind nicht standardmäßige FreeBSD-Erweiterungen und möglicherweise nicht auf anderen Betriebssystemen verfügbar.


25
2017-10-17 11:54



Ich habe damit auf Mac gekämpft. Außerdem musste ich den Variablenaustausch verwenden. Also habe ich benutzt:

sed -i '' "/$pattern/d" $file

woher $file ist eine Datei, in der gelöscht werden muss und $pattern ist das Muster, das zum Löschen angepasst werden soll. Wählte die '' davon Kommentar. Die Sache, die hier zu beachten ist, ist die Verwendung von Anführungszeichen im "/$pattern/d". Die Variable funktioniert nicht, wenn wir ein einzelnes Anführungszeichen verwenden.


13
2018-03-09 15:39



Um ein Inplace-ähnliches Ergebnis zu erhalten grep du kannst das:

echo "$(grep -v "pattern" filename)" >filename

12
2018-06-13 19:24



Ich habe einen kleinen Maßstab mit einer Datei gemacht, die ungefähr 345 000 Zeilen enthält. Der Weg mit grep scheint etwa 15 mal schneller als die sed Methode in diesem Fall.

Ich habe sowohl mit als auch ohne die Einstellung LC_ALL = C versucht, es scheint die Zeiten 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:

time sed -i "/CDGA_00004.pdbqt.gz.tar/d" /tmp/input.txt

real    0m0.711s
user    0m0.179s
sys     0m0.530s

time perl -ni -e 'print unless /CDGA_00004.pdbqt.gz.tar/' /tmp/input.txt

real    0m0.105s
user    0m0.088s
sys     0m0.016s

time (grep -v CDGA_00004.pdbqt.gz.tar /tmp/input.txt > /tmp/input.tmp; mv /tmp/input.tmp /tmp/input.txt )

real    0m0.046s
user    0m0.014s
sys     0m0.019s

10
2018-03-19 12:45



SED:

AWK:

GREP:


8
2017-08-25 08:21



Du kannst das auch benutzen

 grep -v 'pattern' filename

Hier wird -v nur anders als dein Muster gedruckt (das bedeutet Invert match)


7
2018-03-28 07:11