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

Wie kann man Zeichen rekursiv durch sed ersetzen?

Sie können Folgendes tun:

> echo XXXX | sed -e ':loop' -e 's/XX/XoX/g' -e 't loop'
XoXoXoX

Mit:

  • -e ':loop' :Erstellen Sie ein "Loop"-Label
  • -e 't loop' :Springe zum "loop"-Label, wenn die vorherige Substitution erfolgreich war

In diesem speziellen Fall wäre ein Look-Ahead oder Look-Behind sinnvoll. Ich denke GNU sed unterstützt diese nicht. Mit perl :

perl -ne 's/X(?=X)/Xo/g; print;'

Sie können Lookbehind und Lookahead auch wie folgt verwenden:

s/(?<=X)(?=X)/o/g

Wo:

(?<=X) ist ein positiver Lookbehind, eine Assertion der Länge Null, die sicherstellt, dass wir ein X vor der aktuellen Position haben
(?=X) ist ein positiver Lookahead, eine Assertion der Länge Null, die sicherstellt, dass wir ein X nach der aktuellen Position haben

Verwendung in einem Perl-Einzeiler:

perl -pe 's/(?<=X)(?=X)/o/g' inputfile

Wo:

-p bewirkt, dass Perl eine Programmschleife mit einem impliziten Druck der aktuellen Zeile annimmt


Die Schleifenantwort ist der allgemeine Weg, um das zu tun, was Sie fragen.

Im Falle Ihrer Daten können Sie jedoch, vorausgesetzt, Sie verwenden GNU, einfach Folgendes tun:

sed 's/\B/o/g'

Die \b und \B Optionen sind Regex-Erweiterungen:

  • \b entspricht Wortgrenzen, d. h. dem Übergang von einem "Wort"-Zeichen zu einem "Nicht-Wort"-Zeichen oder umgekehrt
  • \B entspricht dem Gegenteil von \b . dh die Lücken "innerhalb" von Wörtern. Dadurch können wir bei Bedarf Zeichen innerhalb eines Wortes einfügen, aber nicht außerhalb.

Probieren Sie es online aus.

Dies setzt voraus, dass die eingegebenen Zeichen tatsächlich alle "Wort"-Zeichen sind.

Wenn Sie kein GNU sed haben oder die Eingabezeichen nicht alle "Wort"-Zeichen sind, können Sie Ihr Ziel auch ohne Schleifen erreichen:

sed 's/./&o/g;s/o$//'

Dies setzt einfach eine o nach jedem Zeichen und entfernt dann das abschließende o aus der Zeichenfolge.

Probieren Sie es online aus.


Linux
  1. Wie ersetze ich eine Zeichenfolge in einer oder mehreren Dateien?

  2. Wie erreicht man Portabilität mit Sed -i (In-Place-Editing)?

  3. Wie verwendet man Sed, um eine mehrzeilige Zeichenfolge zu ersetzen?

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

  5. Wie verwendet man Sed oder Ex, um einen Block (mehrzeiliger Code) durch einen neuen Textblock (Code) zu ersetzen?

So ersetzen Sie Docker durch Podman auf einem Mac

So kopieren Sie Dateien mit einer bestimmten Dateierweiterung rekursiv

Wie ersetzt man sed wie Text durch Python?

Ersetzen Sie in Bash ein Wort durch ein anderes

Wie verwendet man sed, um die Variable einer Konfigurationsdatei zu ersetzen?

So entfernen Sie \r-Zeichen mit sed