it-swarm.com.de

Wie finde ich Linien, die zu einem Muster passen, und lösche sie?

In einer Datei mit vielen Zeilen möchte ich Zeilen löschen, die mit HERE IT IS beginnen.

Wie kann ich dies nur mit Befehlszeilentools tun?

13
micgeronimo

Versuchen Sie sed:

sed -i '/^HERE IT IS/d' <file>

WARNUNG: Es ist besser, eine Sicherungskopie zu erstellen, wenn Sie den Schalter -i von sed verwenden:

sed -i.bak '/^HERE IT IS/d' <file>

Die Originaldatei bleibt als <file>.bak und die geänderte Datei ist <file>.

28
heemayl

Zusätzlich zu den sehr guten Antworten grep und sed, die Sie erhalten haben, gibt es hier einige andere Tools, die dasselbe tun können:

  • Ein paar Perl-Möglichkeiten:

    Perl -ne '/^HERE IT IS/ || print' file > newfile
    Perl -ne 'print if !/^HERE IT IS/' file > newfile
    Perl -ne 'print unless /^HERE IT IS/' file > newfile
    

    Sie können den Schalter -i zu jedem der Beispiele hinzufügen, um die Datei an Ort und Stelle zu bearbeiten:

    Perl -i.bak -ne '/^HERE IT IS/ || print' file        
    
  • (gaffen

    awk '!/^HERE IT IS/' file > newfile
    

    Neuere Versionen (4.1.1 und höher) von GNU awk (der Standardwert awk unter Linux) können die Datei auch direkt bearbeiten:

    gawk -i inplace  '!/^HERE IT IS/' file
    
  • Shell (bash, zsh, ksh, wahrscheinlich andere). Das ist zwar irgendwie albern, es kann gemacht werden , aber andere Werkzeuge sind besser.

    while IFS= read -r line; do 
      [[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
    done < file > newfile
    
16
terdon

Ich würde grep verwenden, um sie herauszufiltern. Beispielsweise :

grep -v "^HERE IT IS" infile > outfile

Verschieben Sie dann die Ausgangsdatei zurück in die Infile-Datei.

13
Ben Hills

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, aufgrund des I in der Musterreferenz.

sed -i '/HERE IT IS/Id' <file>

Wenn Sie mehrere Dateien in einem Verzeichnis haben, in dem Sie dies tun möchten, können Sie es mit find like so kombinieren.

find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +

Die Option maxdepth bedeutet, dass dies nicht in Verzeichnisse wiederkehrt.

5
Arronical

Grep

grep -P '^(?!HERE IT IS)' file

(?!HERE IT IS) Negative Lookahead-Assertion, die die Regex-Engine dazu veranlasst, mit allen Zeilenstartgrenzen ( übereinzustimmen, die normalerweise mit ^ übereinstimmen. nur wenn es nicht von der Zeichenfolge HERE IT IS gefolgt wird

Python

#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
    for line in f:
        if not line.startswith('HERE IT IS'):
            print(line, end="")

Speichern Sie das Skript in einer Datei, sagen Sie script.py und führen Sie es dann über den folgenden Befehl auf dem Terminal aus.

python3 script.py infile
4
Avinash Raj

Eine andere python Option:

#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]

Wobei f der Pfad zur Datei zwischen Anführungszeichen ist.

4
Jacob Vlijm

Sie können Vim im Ex-Modus verwenden:

ex -sc 'g/^HERE IT IS/d' -cx file
  1. g globale Suche

  2. d löschen

  3. x speichern und schließen

1
Steven Penny