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.