sed

Bash Sed-Beispiele

Bash Sed-Beispiele
Mit Bash können Sie Musterersetzungen mithilfe von Variablenerweiterungen wie ($var/pattern/replacement) durchführen. Und so funktioniert sed (sed -e 's/pattern/replacement/'). Es gibt jedoch mehr zu sed als das Ersetzen von Mustern in Textdateien.  Hier werden wir sed zum Beispiel mit äquivalenten Befehlen und Arbeitsabläufen wiederentdecken, um die täglichen Aufgaben zu erleichtern.

Setup für sed-Beispiele

Hier ist eine kurze Anleitung zum Einrichten für das Beispiel, die ich versuchen werde, nicht zu übertrieben zu machen.

„words“ ist eine Textdatei mit den Zahlen 1 bis 100. Wenn Sie sich bezüglich des Befehls zum Erstellen nicht sicher sind, lesen Sie die Exportfunktion für xargs im Bash-Exportbefehl. Du weißt nie, dass es bei deinem nächsten Shell-Scripting-Interview sein könnte.

„bar“ ist eine Textdatei mit einer einzelnen Zeile -.

„old-php“ ist eine Textdatei, die Zeilen von altem PHP enthält, die in php7 oder höher kaputt gehen. (Hinweis: ereg)

Beachten Sie, dass alle oben beschriebenen Funktionen unten in der Endnote zu den Funktionen für die Einrichtung zu finden sind.

Sed-Beispiele mit äquivalenten Befehlen

In einer Befehlszeilenumgebung werden Sie feststellen, dass es mehr als eine Lösung für eine bestimmte Aufgabe gibt. Meistens möchten Sie jedoch den Weg gehen, der den geringsten Widerstand bietet. Hier ist eine Liste von Beispielen für sed-Befehle mit entsprechenden äquivalenten Befehlen, von denen einige im Folgenden ausführlich behandelt werden.

1. Eine zufällige Zeile ausgeben (entspricht sort -R - | head -1)

sed -n "$(( ZUFALL % 100 ))p" -

2.Drucken Sie die letzte Zeile in der Datei (entspricht Kopf -1 -)

sed -n '$p' -

3. Drucken Sie die ersten 10 Zeilen einer Datei (entspricht head -n 10 -)

sed '10q' -

4. Drucken Sie die erste Zeile in einer Datei (entspricht tail -1 -)

sed -n '1p' -

5. Löschen Sie alle Instanzen eines Zeichens (entspricht tr -delete '0' -, wobei 0 das Zeichen ist, das wir löschen möchten)

sed -e 's/0//g' -

6. csv-Datei in tsv konvertieren (entspricht tr ',"\t' -)

sed -e 's/,/\t/g' -

7.Zeile an Datei anhängen (entspricht Cat-Leiste -)

sed '$a ---' -

8. Zeile der Datei voranstellen (entspricht cat - bar)

sed '1i ---' -

9. Alle Zeilen in der Datei ausdrucken (entspricht cat -)

sed -n -e 'p' -

10. Drucken Sie eine Zeile, die einem Muster entspricht (entspricht grep -e '^1' -)

sed -n -e '/^1/p' -

11. Zeilen löschen, die einem Muster entsprechen (entspricht grep -v -e '^1' -)

sed -e '/^1/d' -

12. Holen Sie sich die Anzahl der Zeilen in einer Datei (entspricht wc -l -)

sed -n -e '$=' -

13. Im Hintergrund in eine Datei schreiben (entsprechendes Befehls-T-Stück)

sed "w $1" -

Beispiel mit sed zur Implementierung des tee-Befehls

Rechts oben befindet sich ein Beispiel mit der Bezeichnung Write to a file in the background. Klingt irgendwie nach dem Abschlag-Befehl. Nun, es ist. Hier werden wir die Implementierung einer Funktion zum Ersetzen von tee in bash mit sed erweitern.

Befehle

T-Stück ()

test $# -eq 1 || Rückkehr;
sed "w $1" -

Haupt ()

seq 10 | T-Stück zehn;
Katze zehn

Main

Ausgabe

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

Hier sehen Sie zwei Auflistungen der ganzen Zahlen von 1 bis 10. Der erste ist vom seq-Befehl. Die zweite erhalten wir von der Katze der in tee geschriebenen Datei file. Ich weiß, es ist lächerlich, aber es funktioniert!

Beispiel mit sed zum Ausdrucken einer zufälligen Zeile in einer Datei

Angenommen, wir möchten eine zufällige Zeile in einer Datei mit bash und ein wenig sed ausgeben. Können wir es tun? Ja wir können! Hier ist wie.

Implementieren Sie eine Funktion, die

  1. Ruft die Anzahl der Zeilen in einer Datei ab, L
  2. Erzeugt eine Zufallszahl zwischen 1 und L, R
  3. Druckt R

Die Funktion erwartet, dass die Eingabe von außen geleitet wird.

Befehle

eine Zeile ()

Funktion lc ()

sed -n -e '$=' -
;
Funktion Druckzeile ()

sed -n -e "$1p" -
;
temp=$(mktemp);
Katze -> $temp;
Katze $temp | Druckzeile $(( RANDOM % $( cat $temp | lc ) + 1 ));
rm $temp

Anwendungsbeispiel (1)

Sequenz 100 | _

Ausgang (1)

35

Anwendungsbeispiel (2)

curl https://linuxhint.com/bash_cut_command/ --silent | Strip-Tags | etwas-Linie

Sehen Sie sich das folgende Beispiel an, in dem sed verwendet wird, um HTML-Tags zu entfernen. Beachten Sie, dass das Over-Beispiel manchmal leer für leere Zeilen zurückgibt. Als Übung kann es verbessert werden.

Verwenden von sed zum Drucken von Zeilen in einer Datei

Angenommen, Sie möchten eine Funktion in bash implementieren, um eine bestimmte Zeile in einer Datei auszugeben. Der Versuch, eine einzelne Zeile in einer Datei mit einer Schleife in bash, head, tail oder awk zu drucken, ist zu viel Arbeit, um Zeilen in einer Datei auszudrucken. Gut, dass wir sed haben. Die resultierende Funktion mit sed wäre wie folgt.

Befehle

Druckzeile ()

sed -n "$1p" -

Sehen wir uns nun an, was passiert, wenn wir print-line auf Wörtern verwenden.

Befehle

Wörter | Druckzeile 50

Ausgabe

50

okay. Sieht gut aus, aber lass uns etwas versuchen, das etwas weniger trivial aussieht.

Befehle

deklariere -xf Wörter
deklariere -xf print-line
seq 1 10 $( Wörter | wc -l ) | xargs -i  bash -c "Wörter | Druckzeile "

Ausgabe

1
11
21
31
41
51
61
71
81
91

okay. Das ist jetzt eher so! Sie sehen, wie sed in einem Bash-Skript verwendet werden kann, um eine beliebige Zeile in einer Datei auszudrucken.

Sed-Beispiele ohne entsprechende Befehle

In einer Befehlszeilenumgebung ist manchmal der Weg zu einer Lösung mit dem geringsten Widerstand der sed-Weg; andernfalls machst du am Ende mehr Arbeit als nötig required. Einige Befehle können unten aufgeführt sein.

Befehlen Sie alle Zeilen in einem Shell-Skript

sed -e 's/^/#/' -
Erste Zeile löschen
sed -e '1d' -
Letzte Zeile löschen
sed -e '$d' -
Fügen Sie eine Linie vor Linien ein, die einem Muster entsprechen
sed '/0$/i ---' -
Fügen Sie eine Zeile nach Zeilen ein, die einem Muster entsprechen
sed '/0$/ ---' -
Entfernen Sie HTML-Tags
sed -e 's/<[^>]*.//G' -
Aktualisieren Sie Ereg im alten PHP-Code, um in PHP7 oder höher ausgeführt zu werden
sed 's/ereg(\([^,]*\).\([^)]*\)./strpos(\2,\1)/g'
Überprüfen Sie, ob sed älter als eine bestimmte Version ist
sed -e 'v 4.5' -

Beispiel für eine Verzweigung der sed-Version in bash

Oben in den Beispielen gibt es eine Zeile zum Überprüfen, ob sed älter als eine bestimmte Version ist, die wir verwenden können, um Versionsverzweigungen in bash zu implementieren, was meiner Meinung nach einfacher ist, als zu versuchen, eine Funktion zum Vergleichen von Versionsnummern aus der Ausgabe von sed -version zu implementieren. Der einzige Fallstrick ist, dass wir in Schwierigkeiten sind, wenn es eine frühere Version von sed gibt, die den v-Befehl nicht unterstützt.

Befehle

test-sed-version-at-most()
echo -n | sed "v $1" - 2>/dev/null

Versuchsversion ()

echo -n "Version $1. okay. Tun Sie es ";
test-sed-version-höchstens $1 &&
echo -n "alt";
wahr
||
echo -n "neu"
;
Echo "Weg"."

Haupt ()

lokale v;
für v in 4.4,5;
tun
Versuchsversion $v;
getan

Main

Ausgabe

Version 4.4. okay. Mach es auf die alte Art.
Version 4.5. okay. Mach es auf die neue Art.

Beachten Sie, dass die Version von sed, die ab der Eingabe dieser Zeichen auf meinem Computer ausgeführt wird, 4 . ist.4, was die obige Ausgabe erklären würde. Gleichzeitig war die neueste Version von gnu sed 4.7, etwa 3 Jahre älter als die, die ich habe. Mein Sed ist alt! Tatsächlich in sed 4.0.6 wurde dem Versionsbefehl ein Parameter hinzugefügt, sodass diese Strategie für mindestens v4 . funktioniert.0.6, was nachsichtig ist, wenn man bedenkt, dass die Version Anfang 2003 veröffentlicht wurde. Du bist gut.

Ich habe extra gegraben, eigentlich NEWS aus dem neuesten Quellcode gelesen reading. Version 4.6 hat eine neue Funktion, -debug, die das Skript ausgibt und Ausgabezeilen mit Anmerkungen versehen. Auf diese Weise können Sie sed-Skripte, die von Funktionen in der bash generiert wurden, in die kanonische Form übersetzen. Cool! Vergessen Sie nur nicht, dass Sie die Verzweigung der sed-Version in der bash benötigen. Hier kommt dieses Sed-Beispiel ins Spiel.

Beispiel einer Bash-Funktion mit sed zum Entfernen von HTML-Tags

In den obigen Beispielen gibt es eine Zeile zum Entfernen von HTML-Tags. Lass uns das in eine Bash-Funktion werfen und damit alle HTML-Tags aus dem letzten Artikel entfernen, den ich geschrieben habe.

Befehle

Streifen-Tags ()

sed -e 's/<[^>]*.//G' -

curl https://linuxhint.com/bash_cut_command/ --silent | Strip-Tags

Ich kann nicht sagen, dass es perfekt ist, aber zumindest ist es im Terminal lesbar.

Sed-Beispiele mit Workflows: Beispiel-Workflow: Ersetzen Sie alle sicher mit find, grep und sed

Es kann mit Sicherheit gesagt werden, dass Änderungen, die mit sed mit der Option -i vorgenommen wurden, irreversibel sind. Das heißt, wenn Sie nicht ganz sicher sind, welcher Text ersetzt werden soll, haben Sie wahrscheinlich ein Zeichen weniger als beabsichtigt less. Aus diesem Grund verwenden wir in diesem Beispiel sed in einem Workflow, um Text in allen von Ihnen ausgewählten Dateien sicher zu ersetzen.

Arbeitsablauf

  1. finden
  2. grep
  3. sed
finden

Hier wählen Sie die Dateien aus, die ersetzt werden sollen. Ich schlage vor, einen Befehl in dieser Richtung zu verwenden:

find -type f -name | grep -v -e | xargs -i …

Zum Beispiel möchten Sie vielleicht die Dateien einschränken, um PHP-Dateien zu ersetzen, mit Ausnahme von Git-Repository-Verzeichnissen, wie folgt:.

find -type f -name \*.php | grep -v -e '.git' | xargs - ich…

Lesen Sie mehr über den xargs-Befehl in bash.

grep

Als nächstes werden wir versuchen, some_pattern in den wie folgt ausgewählten Dateien abzugleichen. Beachten Sie, dass, da wir die Option -o für grep verwenden, die Ausgabe nur eine übereinstimmende Zeichenfolge anzeigt, falls vorhanden.

find -type f -name \*.php | grep -v -e '.git' |
xargs -i grep -e some_pattern -o

Der obige Befehl sollte eine Liste von Strings zurückgeben, die mit some_pattern übereinstimmen.

sed

Schließlich wollen wir alle Strings ersetzen, die mit some_pattern übereinstimmen. Dazu müssen wir grep wie folgt in sed umwandeln.

find -type f -name \*.php | grep -v -e '.git' |
xargs -i sed -i -e s/some_pattern/replacement/g

Der Befehl grep wird zu sed -i und die Option -o wird entfernt. Und da hast du es.

Jetzt können Sie im Voraus prüfen, welche Saiten in sed ersetzt werden, anstatt Ihr Glück zu testen.

Endnoten zu den in Beispielen verwendeten Optionen

Hier ist eine Liste der Optionen, die in den sed-Beispielen verwendet werden, die kurz besprochen werden.

Möglichkeit Beschreibung
-ich An Ort und Stelle bearbeiten. Wenn es sich bei der Eingabe um eine Datei (nicht über eine Pipe) handelt, überschreibt das Ergebnis der Ausdrücke den Inhalt der Datei.

Sed nimmt einen an

zB) sed -n…

-e -e steht für Ausdruck. Sein Parameter ist ein Ausdruck in der Sprache sed.

Sed akzeptiert viele

zB) sed -e 'expr1' -e 'expr2'…

-nein Blendet die vom Ausdruck nicht betroffene Zeile aus. Das heißt, wenn der Ausdruck eine print-Anweisung in der Sprache sed ist, werden Zeilen, die nicht in der print-Anweisung enthalten sind, nicht in die Ausgabe aufgenommen.

zB) sed -n…

Weitere Informationen zu den verfügbaren sed-Optionen finden Sie unter sed -help

Endnotizen zu äquivalenten Befehlen, die in Beispielen verwendet werden

Die folgenden Befehlszeilen-Dienstprogramme sind in den sed-Beispielen mit entsprechenden Befehlen enthalten.

Endnote am Ende - im Beispiel äquivalente Befehle

Falls Sie sich fragen, was mit dem - Zeichen im Beispiel los ist, ist diese Notiz für Sie. Ich habe nach den meisten Befehlen in den Beispielen ein - Zeichen hinzugefügt, um darauf hinzuweisen, dass wir erwarten, dass die Eingabe über eine Pipe empfangen wird. Das ist,

Katze etwas-Datei | sortieren -R - | Kopf -1

Wenn jedoch der Befehl auf der linken Seite der Pipe vorhanden ist, können wir den Hinweis wie folgt weglassen.

Katze etwas-Datei | sortieren -R | Kopf -1

Das war es mit dem - Zeichen nach den Befehlen in den Beispielen.

Endnoten zu Funktionen für die Einrichtung

Falls Sie suchen, hier sind Funktionen zum Setup für die obigen Beispiele. Die mit deklarieren -f . erhaltene Ausgabe. Lesen Sie mehr über den Deklaration-Befehl in der Bash für weitere Verwendungen.

Befehle

Wörter ()

sequenz 100

Bar ()

Echo ---

alte-php()

echo 'ereg($UA,"Bottybot")'

Endeffekt

Ich habe es genossen, Bash-Sed-Beispiele zu schreiben und habe sogar ein paar zusätzliche Tricks dabei gelernt. Sed ist ein leistungsstarkes Befehlszeilenprogramm und eine ausdrucksstarke Sprache zum Bearbeiten von Textdateien text. Wenn Sie gerne etwas über Sed erfahren haben, machen Sie sich keine Sorgen, es gibt noch viel mehr zu berühren. Sed an.

Top Oculus App Lab-Spiele
Wenn Sie Besitzer eines Oculus-Headsets sind, müssen Sie über Sideloading informiert sein. Sideloading ist der Prozess der Installation von Inhalten, ...
Top 10 Spiele zum Spielen auf Ubuntu
Die Windows-Plattform war eine der dominierenden Plattformen für Spiele aufgrund des großen Prozentsatzes von Spielen, die heute entwickelt werden, um...
Die 5 besten Arcade-Spiele für Linux
Heutzutage sind Computer ernsthafte Maschinen, die zum Spielen verwendet werden. Wenn du den neuen Highscore nicht bekommst, weißt du was ich meine. I...