Ein Terminalfenster auf einem Linux-System.

Fatmawati Achmad Zaenuri/Shutterstock

Es mag verrückt klingen, aber das Linux |_+_| Befehl ist ein Texteditor ohne Schnittstelle. Sie können es über die Befehlszeile verwenden, um Text in Dateien und Streams zu bearbeiten. Wir zeigen Ihnen, wie Sie seine Kraft nutzen können.



Die Kraft von sed

Die |_+_| Command ist ein bisschen wie Schach: Man braucht eine Stunde, um die Grundlagen zu lernen, und ein ganzes Leben, um sie zu beherrschen (oder zumindest viel Übung). Wir zeigen Ihnen eine Auswahl von Eröffnungsgambits in jeder der Hauptkategorien von |_+_| Funktionalität.

|_+_| ist ein Stream-Editor das funktioniert bei über Pipe geleiteten Eingaben oder Textdateien. Es hat jedoch keine interaktive Texteditor-Oberfläche. Stattdessen geben Sie Anweisungen, die Sie beim Durcharbeiten des Textes befolgen können. Dies alles funktioniert in Bash und anderen Befehlszeilen-Shells.

Mit |_+_| Sie können Folgendes tun:

  • Text auswählen
  • Ersatztext
  • Zeilen zum Text hinzufügen
  • Zeilen aus Text löschen
  • Ändern (oder bewahren) Sie eine Originaldatei

Wir haben unsere Beispiele strukturiert, um Konzepte vorzustellen und zu demonstrieren, nicht um das knappste (und am wenigsten zugängliche) zu produzieren |_+_| Befehle. Die Mustervergleichs- und Textauswahlfunktionen von |_+_| verlassen sich stark auf reguläre Ausdrücke ( Regexes ). Sie müssen mit diesen vertraut sein, um das Beste aus |_+_| herauszuholen.

VERBUNDEN: So verwenden Sie reguläre Ausdrücke (Regexes) unter Linux

Ein einfaches Beispiel

Zuerst verwenden wir |_+_| um einen Text an |_+_| . zu senden durch ein Rohr , und haben |_+_| einen Teil des Textes ersetzen. Dazu geben wir Folgendes ein:

sedAnzeige

Die |_+_| Befehl sendet howtogonk in |_+_|, und unsere einfache Ersetzungsregel (das s steht für Ersetzung) wird angewendet. |_+_| durchsucht den Eingabetext nach einem Vorkommen der ersten Zeichenfolge und ersetzt alle Übereinstimmungen durch die zweite.

Die Zeichenfolge gonk wird durch geek ersetzt und die neue Zeichenfolge wird im Terminalfenster gedruckt.

Siehe Outlook-Kalender in Google

Ersetzungen sind wahrscheinlich die häufigste Verwendung von |_+_|. Bevor wir uns jedoch eingehender mit Ersetzungen befassen, müssen wir wissen, wie man Text auswählt und abgleicht.

Auswählen von Text

Für unsere Beispiele benötigen wir eine Textdatei. Wir verwenden einen, der eine Auswahl von Versen aus Samuel Taylor Coleridges epischem Gedicht The Rime of the Ancient Mariner enthält.

Wir geben Folgendes ein, um es mit |_+_| zu betrachten:

sed

Um einige Zeilen aus der Datei auszuwählen, geben wir die Start- und Endzeilen des Bereichs an, den wir auswählen möchten. Eine einzelne Zahl wählt diese eine Zeile aus.

Anzeige

Um die Zeilen eins bis vier zu extrahieren, geben wir diesen Befehl ein:

sed

Beachte das Komma zwischen |_+_| und |_+_|. Die |_+_| bedeutet übereinstimmende Zeilen drucken. Standardmäßig ist |_+_| druckt alle Zeilen. Wir sehen den gesamten Text in der Datei mit den übereinstimmenden Zeilen zweimal gedruckt. Um dies zu verhindern, verwenden wir die |_+_| (leise) Option, um den nicht übereinstimmenden Text zu unterdrücken.

Wir ändern die Zeilennummern, damit wir einen anderen Vers auswählen können, wie unten gezeigt:

sed

Wir können die |_+_| . verwenden (Ausdruck) Option, um mehrere Auswahlen zu treffen. Mit zwei Ausdrücken können wir zwei Verse auswählen, etwa so:

sed

Wenn wir die erste Zahl im zweiten Ausdruck reduzieren, können wir zwischen den beiden Versen ein Leerzeichen einfügen. Wir geben folgendes ein:

sed

Wir können auch eine Startlinie wählen und |_+_| . sagen um durch die Datei zu blättern und jede fünfte Zeile abwechselnd zu drucken oder eine beliebige Anzahl von Zeilen zu überspringen. Der Befehl ähnelt dem, den wir oben zum Auswählen eines Bereichs verwendet haben. Diesmal verwenden wir jedoch eine Tilde (|_+_|) anstelle eines Kommas, um die Zahlen zu trennen.

Anzeige

Die erste Zahl gibt die Startlinie an. Die zweite Zahl sagt |_+_| welche Linien nach der Startlinie wir sehen wollen. Die Zahl 2 bedeutet jede zweite Zeile, 3 bedeutet jede dritte Zeile und so weiter.

Wir geben folgendes ein:

sed

Sie wissen nicht immer, wo sich der gesuchte Text in der Datei befindet, was bedeutet, dass Zeilennummern nicht immer hilfreich sind. Sie können jedoch auch |_+_| . verwenden um Zeilen auszuwählen, die übereinstimmende Textmuster enthalten. Lassen Sie uns zum Beispiel alle Zeilen extrahieren, die mit And beginnen.

Das Caretzeichen (|_+_|) steht für den Zeilenanfang. Wir schließen unseren Suchbegriff in Schrägstriche (|_+_|) ein. Wir fügen auch ein Leerzeichen nach ein. Wörter wie Android werden also nicht in das Ergebnis aufgenommen.

Lesen |_+_| Skripte können anfangs etwas schwierig sein. Die |_+_| bedeutet print, genau wie in den Befehlen, die wir oben verwendet haben. Im folgenden Befehl wird ihm jedoch ein Schrägstrich vorangestellt:

sed

Drei Zeilen, die mit And beginnen, werden aus der Datei extrahiert und für uns angezeigt.

Ersetzungen vornehmen

In unserem ersten Beispiel haben wir Ihnen das folgende Grundformat für ein |_+_| . gezeigt Auswechslung:

echoAnzeige

Die |_+_| sagt |_+_| das ist ein Ersatz. Die erste Zeichenfolge ist das Suchmuster und die zweite ist der Text, durch den wir diesen übereinstimmenden Text ersetzen möchten. Natürlich steckt der Teufel wie bei allem, was mit Linux zu tun hat, im Detail.

Wir geben Folgendes ein, um alle Vorkommnisse von Tag zu Woche zu ändern und dem Seemann und Albatros mehr Zeit zu geben, sich zu verbinden:

sed

In der ersten Zeile wird nur das zweite Vorkommen des Tages geändert. Dies liegt daran, dass |_+_| stoppt nach dem ersten Spiel pro Zeile. Wir müssen ein g am Ende des Ausdrucks hinzufügen, wie unten gezeigt, um eine globale Suche durchzuführen, damit alle Übereinstimmungen in jeder Zeile verarbeitet werden:

sed

Dies entspricht drei von vier in der ersten Zeile. Denn das erste Wort ist Tag und |_+_| beachtet die Groß-/Kleinschreibung, diese Instanz wird nicht als Tag betrachtet.

Wir geben Folgendes ein und fügen ein |_+_| . hinzu an den Befehl am Ende des Ausdrucks, um die Groß-/Kleinschreibung anzuzeigen:

echo

Dies funktioniert, aber Sie möchten möglicherweise nicht immer die Groß-/Kleinschreibung für alles aktivieren. In diesen Fällen können Sie eine Regex-Gruppe verwenden, um musterspezifische Groß-/Kleinschreibung zu berücksichtigen.

Anzeige

Wenn wir beispielsweise Zeichen in eckige Klammern (|_+_|) einschließen, werden sie als beliebige Zeichen aus dieser Zeichenliste interpretiert.

Wir geben Folgendes ein und fügen D und d in die Gruppe ein, um sicherzustellen, dass sowohl Tag als auch Tag übereinstimmen:

sed

Wir können Ersetzungen auch auf Abschnitte der Datei beschränken. Nehmen wir an, unsere Datei enthält im ersten Vers seltsame Abstände. Wir können den folgenden vertrauten Befehl verwenden, um den ersten Vers zu sehen:

sed

Wir suchen nach zwei Leerzeichen und ersetzen sie durch eins. Wir werden dies global tun, damit die Aktion über die gesamte Linie wiederholt wird. Zur Verdeutlichung ist das Suchmuster Leerzeichen, Leerzeichen Sternchen (|_+_|) und die Ersetzungszeichenfolge ist ein einzelnes Leerzeichen. Die |_+_| beschränkt die Ersetzung auf die ersten vier Zeilen der Datei.

All das fassen wir in folgendem Befehl zusammen:

sed

Das funktioniert gut! Wichtig ist hier das Suchmuster. Das Sternchen (|_+_|) steht für null oder mehr des vorhergehenden Zeichens, das ein Leerzeichen ist. Somit sucht das Suchmuster nach Zeichenfolgen mit einem oder mehreren Leerzeichen.

Anzeige

Wenn wir eine beliebige Folge von mehreren Leerzeichen durch ein einzelnes Leerzeichen ersetzen, wird die Datei auf den regulären Abstand zurückgesetzt, mit einem einzelnen Leerzeichen zwischen jedem Wort. Dadurch wird in einigen Fällen auch ein einzelnes Leerzeichen durch ein einzelnes Leerzeichen ersetzt, aber dies hat keine negativen Auswirkungen – wir erhalten immer noch unser gewünschtes Ergebnis.

Wenn wir Folgendes eingeben und das Suchmuster auf ein einziges Leerzeichen reduzieren, sehen Sie sofort, warum wir zwei Leerzeichen einfügen müssen:

less

Da das Sternchen mit null oder mehr des vorhergehenden Zeichens übereinstimmt, sieht es jedes Zeichen, das kein Leerzeichen ist, als Null-Leerzeichen und wendet die Ersetzung darauf an.

Wenn wir jedoch zwei Leerzeichen in das Suchmuster einschließen, ist |_+_| muss mindestens ein Leerzeichen finden, bevor die Ersetzung angewendet wird. Dadurch wird sichergestellt, dass Nicht-Leerzeichen unberührt bleiben.

Wir geben Folgendes ein, indem wir |_+_| . verwenden (Ausdruck), den wir zuvor verwendet haben, was es uns ermöglicht, zwei oder mehr Ersetzungen gleichzeitig vorzunehmen:

1

Wir können das gleiche Ergebnis erzielen, wenn wir ein Semikolon (|_+_|) verwenden, um die beiden Ausdrücke wie folgt zu trennen:

4

Anzeige

Als wir im folgenden Befehl Tag für Woche vertauschten, wurde auch die Instanz von Tag im Ausdruck well a-day vertauscht:

p

Um dies zu verhindern, können wir Ersetzungen nur an Zeilen versuchen, die einem anderen Muster entsprechen. Wenn wir den Befehl so ändern, dass er am Anfang ein Suchmuster hat, ziehen wir nur in Betracht, auf Zeilen zu arbeiten, die diesem Muster entsprechen.

Wir geben Folgendes ein, um unser passendes Muster zum folgenden Wort zu machen:

sed

Das gibt uns die Antwort, die wir wollen.

Komplexere Substitutionen

Lass uns Coleridge eine Pause gönnen und |_+_| . verwenden um Namen aus dem |_+_| . zu extrahieren Datei.

Dafür gibt es kürzere Wege (dazu später mehr), aber wir verwenden hier den längeren Weg, um ein anderes Konzept zu demonstrieren. Jedes übereinstimmende Element in einem Suchmuster (so genannte Unterausdrücke) kann nummeriert werden (bis zu neun Elemente). Sie können diese Nummern dann in Ihrem |_+_| . verwenden Befehle zum Verweisen auf bestimmte Unterausdrücke.

Damit dies funktioniert, müssen Sie den Unterausdruck in Klammern [|_+_|] setzen. Den Klammern muss außerdem ein umgekehrter Schrägstrich (|_+_|) vorangestellt werden, damit sie nicht als normales Zeichen behandelt werden.

Dazu würden Sie Folgendes eingeben:

-n

Lassen Sie uns das aufschlüsseln:

    -e:Die |_+_| Befehl und den Anfang des Substitutionsausdrucks. sed:Die öffnende Klammer [|_+_|] umschließt den Unterausdruck, gefolgt von einem umgekehrten Schrägstrich (|_+_|). ~:Der erste Teilausdruck des Suchbegriffs enthält eine Gruppe in eckigen Klammern. Das Caretzeichen (|_+_|) bedeutet nicht, wenn es in einer Gruppe verwendet wird. Eine Gruppe bedeutet, dass jedes Zeichen, das kein Doppelpunkt (|_+_|) ist, als Übereinstimmung akzeptiert wird. sed:Die schließende Klammer [|_+_|] mit einem vorangestellten Backslash (|_+_|). sed:Dieser zweite Suchunterausdruck bedeutet ein beliebiges Zeichen und eine beliebige Anzahl davon. ^:Der Substitutionsteil des Ausdrucks enthält |_+_| mit vorangestelltem Backslash (|_+_|). Dies stellt den Text dar, der mit dem ersten Unterausdruck übereinstimmt. /:Der abschließende Schrägstrich (|_+_|) und das einfache Anführungszeichen (|_+_|) beenden das |_+_| Befehl.
Anzeige

Das alles bedeutet, dass wir nach einer beliebigen Zeichenfolge suchen, die keinen Doppelpunkt (|_+_|) enthält, die die erste Instanz von übereinstimmendem Text ist. Dann suchen wir nach etwas anderem in dieser Zeile, das die zweite Instanz des übereinstimmenden Textes ist. Wir werden die gesamte Zeile durch den Text ersetzen, der dem ersten Unterausdruck entspricht.

Jede Zeile im |_+_| Die Datei beginnt mit einem mit einem Doppelpunkt abgeschlossenen Benutzernamen. Wir gleichen alles bis zum ersten Doppelpunkt ab und ersetzen dann diesen Wert für die gesamte Zeile. Also haben wir die Benutzernamen isoliert.

Ausgabe von

Als Nächstes schließen wir den zweiten Unterausdruck in Klammern [|_+_|] ein, damit wir ihn auch nach Nummer referenzieren können. Wir ersetzen auch |_+_| mit |_+_|. Unser Befehl ersetzt nun die gesamte Zeile mit allem vom ersten Doppelpunkt (|_+_|) bis zum Ende der Zeile.

Wir geben folgendes ein:

sed

Diese kleinen Änderungen kehren die Bedeutung des Befehls um und wir erhalten alles außer den Benutzernamen.

Werfen wir nun einen Blick auf die schnelle und einfache Möglichkeit, dies zu tun.

Unser Suchbegriff reicht vom ersten Doppelpunkt (|_+_|) bis zum Ende der Zeile. Da unser Ersetzungsausdruck leer ist (|_+_|), werden wir den übereinstimmenden Text durch nichts ersetzen.

Anzeige

Wir geben also Folgendes ein und hacken alles vom ersten Doppelpunkt (|_+_|) bis zum Ende der Zeile ab und lassen nur die Benutzernamen übrig:

/p

Schauen wir uns ein Beispiel an, in dem wir auf die erste und zweite Übereinstimmung im selben Befehl verweisen.

Wir haben eine Datei mit Kommas (|_+_|), die Vor- und Nachnamen trennen. Wir wollen sie als Nachname, Vorname auflisten. Wir können |_+_| verwenden, wie unten gezeigt, um zu sehen, was in der Datei enthalten ist:

sed

Wie viele |_+_| Befehle, dieser nächste mag auf den ersten Blick undurchdringlich aussehen:

s

Dies ist ein Substitutionsbefehl wie die anderen, die wir verwendet haben, und das Suchmuster ist recht einfach. Wir werden es im Folgenden aufschlüsseln:

    sed:Der normale Substitutionsbefehl. sed:Da sich das Caretzeichen nicht in einer Gruppe befindet (|_+_|), bedeutet es den Zeilenanfang. sed:Der erste Unterausdruck ist eine beliebige Anzahl beliebiger Zeichen. Es ist in Klammern [|_+_|] eingeschlossen, denen jeweils ein umgekehrter Schrägstrich (|_+_|) vorangestellt ist, damit wir mit einer Nummer darauf verweisen können. Unser bisheriges gesamtes Suchmuster übersetzt sich als Suche vom Zeilenanfang bis zum ersten Komma (|_+_|) nach beliebig vielen Zeichen. i:Der nächste Unterausdruck ist (wieder) eine beliebige Anzahl von beliebigen Zeichen. Es ist auch in Klammern [|_+_|] eingeschlossen, denen jeweils ein umgekehrter Schrägstrich (|_+_|) vorangestellt ist, damit wir den übereinstimmenden Text anhand der Zahl referenzieren können. []:Das Dollarzeichen (|_+_|) stellt das Ende der Zeile dar und ermöglicht es unserer Suche, bis zum Ende der Zeile fortzufahren. Wir haben dies einfach verwendet, um das Dollarzeichen einzuführen. Wir brauchen es hier nicht wirklich, da das Sternchen (|_+_|) in diesem Szenario bis zum Ende der Zeile stehen würde. Der Schrägstrich (|_+_|) vervollständigt den Suchmusterabschnitt. *:Da wir unsere beiden Unterausdrücke in Klammern gesetzt haben, können wir auf beide durch ihre Nummern verweisen. Da wir die Reihenfolge umkehren möchten, geben wir sie als |_+_| ein. Den Zahlen muss ein Backslash (|_+_|) vorangestellt werden. 1,4:Dadurch kann unser Befehl global in jeder Zeile arbeiten. *:Die Datei, an der wir arbeiten.

Sie können auch den Befehl Ausschneiden (|_+_|) verwenden, um ganze Zeilen zu ersetzen, die Ihrem Suchmuster entsprechen. Wir geben Folgendes ein, um nach einer Zeile mit dem Wort Hals zu suchen und sie durch eine neue Textfolge zu ersetzen:

sed

Anzeige

Unsere neue Zeile erscheint jetzt am Ende unseres Auszugs.

Einfügen von Zeilen und Text

Wir können auch neue Zeilen und Text in unsere Datei einfügen. Um neue Zeilen nach übereinstimmenden Zeilen einzufügen, verwenden wir den Append-Befehl (|_+_|).

Hier ist die Datei, mit der wir arbeiten werden:

Katzenfreaks.txt

Wir haben die Zeilen nummeriert, damit dies etwas einfacher zu verstehen ist.

Wir geben Folgendes ein, um nach Zeilen zu suchen, die das Wort He enthalten, und fügen eine neue Zeile darunter ein:

-e

Wir geben Folgendes ein und fügen den Einfügebefehl (|_+_|) ein, um die neue Zeile über denen einzufügen, die übereinstimmenden Text enthalten:

;

Wir können das kaufmännische Und-Zeichen (|_+_|), das den ursprünglichen übereinstimmenden Text darstellt, verwenden, um einer übereinstimmenden Zeile neuen Text hinzuzufügen. |_+_| , |_+_| usw. repräsentieren übereinstimmende Teilausdrücke.

Anzeige

Um Text am Anfang einer Zeile hinzuzufügen, verwenden wir einen Ersetzungsbefehl, der mit allem in der Zeile übereinstimmt, kombiniert mit einer Ersetzungsklausel, die unseren neuen Text mit der ursprünglichen Zeile kombiniert.

Um all dies zu tun, geben wir Folgendes ein:

sed

Wir geben Folgendes ein, einschließlich der |_+_| Befehl, der zwischen jeder Zeile eine Leerzeile einfügt:

etc/passwd

Wenn Sie zwei oder mehr Leerzeilen hinzufügen möchten, können Sie |_+_|, |_+_| usw. verwenden.

Zeilen löschen

Der Befehl Löschen (|_+_|) löscht Zeilen, die einem Suchmuster entsprechen oder mit Zeilennummern oder Bereichen angegeben sind.

Um beispielsweise die dritte Zeile zu löschen, geben wir Folgendes ein:

sed

Um den Bereich der Zeilen vier bis fünf zu löschen, geben wir Folgendes ein:

()Anzeige

Um Zeilen außerhalb eines Bereichs zu löschen, verwenden wir ein Ausrufezeichen (|_+_|), wie unten gezeigt:

Speichern Ihrer Änderungen

Bisher wurden alle unsere Ergebnisse im Terminalfenster gedruckt, aber wir haben sie noch nirgendwo gespeichert. Um diese dauerhaft zu machen, können Sie Ihre Änderungen entweder in die Originaldatei schreiben oder in eine neue umleiten.

Das Überschreiben Ihrer Originaldatei erfordert einige Vorsicht. Wenn dein |_+_| Wenn der Befehl falsch ist, können Sie möglicherweise einige Änderungen an der Originaldatei vornehmen, die schwer rückgängig zu machen sind.

Für ein wenig Seelenfrieden, |_+_| kann eine Sicherung der Originaldatei erstellen, bevor der Befehl ausgeführt wird.

Sie können die In-Place-Option (|_+_|) verwenden, um |_+_| um die Änderungen in die Originaldatei zu schreiben, aber wenn Sie eine Dateierweiterung hinzufügen, |_+_| wird die Originaldatei in eine neue sichern. Sie hat denselben Namen wie die Originaldatei, jedoch mit einer neuen Dateierweiterung.

Zur Veranschaulichung suchen wir nach Zeilen, die das Wort He enthalten, und löschen sie. Wir werden auch unsere Originaldatei mit der BAK-Erweiterung in einer neuen sichern.

Um all dies zu tun, geben wir Folgendes ein:

sed 's/Anzeige

Wir geben Folgendes ein, um sicherzustellen, dass unsere Sicherungsdatei unverändert ist:

sed

Wir können auch Folgendes eingeben, um die Ausgabe in eine neue Datei umzuleiten und ein ähnliches Ergebnis zu erzielen:

(

Wir verwenden |_+_| um zu bestätigen, dass die Änderungen in die neue Datei geschrieben wurden, wie unten gezeigt:

(

So stoppen Sie Siri-Vorschläge

VERBUNDEN: Wie verwenden Sie Regex eigentlich?

All das sed

Wie Sie wahrscheinlich bemerkt haben, ist sogar diese kurze Einführung zu |_+_| ist ziemlich lang. Dieser Befehl hat viel zu bieten, und es gibt sogar mehr kannst du damit machen .

Hoffentlich haben diese grundlegenden Konzepte jedoch eine solide Grundlage geschaffen, auf der Sie aufbauen können, während Sie weiter lernen.

VERBUNDEN: 10 grundlegende Linux-Befehle für Anfänger

Linux-Befehle
Dateien Teer · pv · Katze · tac · chmod · Griff · unterschied · sed · Mit · Mann · geschoben · popd · fsck · Testdisk · seq · fd · pandoc · CD · $PFAD · awk · beitreten · jq · falten · einzigartig · Journalctl · Schwanz · Zustand · ls · fstab · rauswerfen · weniger · chgrp · chown · rev · suchen · Saiten · Typ · umbenennen · Postleitzahl · entpacken · montieren · ummount · Installieren · fdisk · mkfs · rm · rmdir · rsync · df · gpg · wir · Nano · mkdir · von · ln · Patch · Konvertieren · rclon · Fetzen · SRM
Prozesse alias · Bildschirm · oben · nett · renice · Fortschritt · strace · System · tmux · chsh · Geschichte · beim · Charge · kostenlos · die · dmesg · Benutzermod · ps · chroot · xargs · tty · kleiner Finger · lsof · vmstat · Auszeit · Mauer · ja · töten · Schlaf · sudo · seine · Zeit · groupadd · Benutzermod · Gruppen · lshw · stilllegen · neu starten · halt · ausschalten · passwd · lscpu · crontab · Datum · bg · fg
Vernetzung netstat · Klingeln · Traceroute · ip · ss · Wer ist · fail2ban · bmon · Sie · Finger · nmap · ftp · Locken · wget · Wer · Wer bin ich · In · iptables · ssh-keygen · ufw

VERBUNDEN: Beste Linux-Laptops für Entwickler und Enthusiasten

WEITER LESEN