GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ersetzen einer Teilzeichenfolge durch eine andere Zeichenfolge in Bash

Hier ist das Szenario. Sie haben eine große Zeichenfolge und möchten einen Teil davon durch eine andere Zeichenfolge ersetzen.

Sie möchten beispielsweise „Ich schreibe heute eine Zeile ändern “ bis „Ich schreibe jetzt eine Zeile ".

In diesem kurzen Tutorial zeige ich Ihnen, wie Sie eine Teilzeichenfolge nativ in Bash ersetzen. Ich zeige auch das sed-Befehlsbeispiel als Erweiterung.

Substring nativ in Bash ersetzen (gut für eine einzelne Zeile)

Bash hat einige eingebaute Methoden zur String-Manipulation. Wenn Sie einen Teil einer Zeichenfolge durch einen anderen ersetzen möchten, gehen Sie wie folgt vor:

${main_string/search_term/replace_term}

Erstellen Sie eine String-Variable bestehend aus der Zeile:„Ich schreibe heute eine Zeile“ ohne die Anführungszeichen und ersetzen Sie dann today mit now :

[email protected]:~$ line="I am writing a line today"
[email protected]:~$ echo "${line/today/now}"
I am writing a line now

Hast du verstanden, was gerade passiert ist? In der Syntax "${line/today/now}" , line ist der Name der Variablen, in der ich gerade den gesamten Satz gespeichert habe. Hier weise ich es an, das erste Vorkommen zu ersetzen des Wortes today mit now . Anstatt also den Inhalt der ursprünglichen Variablen anzuzeigen, zeigte es Ihnen die Zeile mit dem geänderten Wort.

Daher die line Variable hat sich nicht wirklich geändert. Es ist immer noch dasselbe:

[email protected]:~$ echo $line
I am writing a line today

Aber Sie können das gewünschte Wort definitiv ersetzen und dieselbe Variable ändern, um die Änderungen dauerhaft zu machen:

[email protected]:~$ line="${line/today/now}"
[email protected]:~$ echo $line
I am writing a line now

Jetzt wurden die Änderungen dauerhaft vorgenommen, und so können Sie das erste Vorkommen eines Teilstrings in einem String dauerhaft ersetzen.

Sie können auch andere Variablen verwenden, um bestimmte Teilstrings zu speichern, die Sie ersetzen möchten:

[email protected]:~$ replace="now"
[email protected]:~$ replacewith="today"
[email protected]:~$ line="${line/${replace}/${replacewith}}"
[email protected]:~$ echo $line
I am writing a line today

Hier habe ich das zu ersetzende Wort in einer Variablen namens replace gespeichert und das Wort, durch das es ersetzt werden soll, innerhalb von replacewith . Danach habe ich die gleiche Methode wie oben beschrieben verwendet, um die Linie zu „überarbeiten“. Jetzt wurden die Änderungen, die ich am Anfang dieses Tutorials vorgenommen hatte, rückgängig gemacht.

Sehen wir uns ein weiteres Beispiel an:

[email protected]:~$ hbday="Happy Birthday! Many Many Happy Returns!"
[email protected]:~$ hbday="${hbday/Many/So Many}"
[email protected]:~$ echo $hbday
Happy Birthday! So Many Many Happy Returns!

Ersetzen aller Vorkommen eines Teilstrings

Sie können auch mehrere Vorkommen von Teilstrings innerhalb von Strings ersetzen. Sehen wir es uns anhand eines anderen Beispiels an:

[email protected]:~$ hbday="${hbday//Many/So Many}"
[email protected]:~$ echo $hbday
Happy Birthday! So Many So Many Happy Returns!

Dieser zusätzliche / nach hbday hat dafür gesorgt, dass alle Vorkommen von Many ersetzt werden mit So Many innerhalb des Satzes.

String mit sed-Befehl ersetzen (kann auch mit Dateien funktionieren)

Hier ist eine andere Möglichkeit, Teilstrings in einem String in Bash zu ersetzen. Verwenden Sie den sed-Befehl auf diese Weise:

Erstes Vorkommen ersetzen:

line=$(sed "s/$replace/s//$replacewith/" <<< "$line")

Wenn ich das erste Beispiel nehme, kann es gespielt werden als:

Sie können auch alle Vorkommen ersetzen, indem Sie g hinzufügen am Ende:

line=$(sed "s/$replace/$replacewith/g" <<< "$line")

Jetzt denken Sie vielleicht, dass dies komplizierter ist als die native Bash-String-Methode. Vielleicht, aber sed ist sehr leistungsfähig und Sie können es verwenden, um alle Vorkommen eines Strings in einer Datei zu ersetzen.

sed -i 's/$replace/$replacewith/' filename

Hier ist ein Beispiel für einige Bücher von Agatha Christie mit „Mord“ im Titel:

[email protected]:~$ cat agatha.txt 
The Murder in the Vicarage
Murder in Mesopotamia
Murder is Easy
Murder on the Orient Express
Murder In Retrospect

Ich werde Mord durch Ehe ersetzen, weil einige Leute denken, dass beides dasselbe ist:

sed -i "s/Murder/Marriage/g" agatha.txt

Und hier ist jetzt die geänderte Datei:

The Marriage in the Vicarage
Marriage in Mesopotamia
Marriage is Easy
Marriage on the Orient Express
Marriage In Retrospect

Sed ist ein sehr leistungsfähiges Werkzeug zum Bearbeiten von Textdateien unter Linux. Sie sollten zumindest die Grundlagen lernen.

Hat Ihnen das Lesen dieses Artikels Spaß gemacht? Wenn Sie etwas über das Ersetzen von Zeichenfolgen oder diesen Artikel mitteilen möchten, tun Sie dies bitte in den Kommentaren unten.


Linux
  1. Wie ersetze ich eine Zeichenfolge durch eine Zeichenfolge, die Slash mit Sed enthält?

  2. Bash -c mit Positionsparametern?

  3. So prüfen Sie, ob String in Bash einen Teilstring enthält

  4. Beispiele für Bash-String-Manipulationen – Länge, Teilstring, Suchen und Ersetzen

  5. Alias ​​mit Variable in Bash

Ersetzen Sie unter Linux du durch Staub

Bash Strings verketten

So prüfen Sie, ob eine Zeichenfolge in Bash eine Teilzeichenfolge enthält

Ersetzen von Zeichenfolgen in Bash

Bash-Scripting – String-Manipulation

Benutzeroberflächen mit Dialog. Bash-Skripting (IV)