できること:
> echo XXXX | sed -e ':loop' -e 's/XX/XoX/g' -e 't loop'
XoXoXoX
と:
-e ':loop'
:「ループ」ラベルを作成します-e 't loop'
:前の置換が成功した場合、「ループ」ラベルにジャンプします
この特定のケースでは、先読みまたは後読みが役立ちます。 GNU sed
だと思います これらをサポートしていません。 perl
で :
perl -ne 's/X(?=X)/Xo/g; print;'
次のように、後読みと先読みを使用することもできます。
s/(?<=X)(?=X)/o/g
場所:
<ブロック引用>
(?<=X)
現在の位置の前に X があることを確認する長さゼロのアサーションである正の後読みです。
(?=X)
は正の先読みであり、現在の位置の後に X があることを確認する長さゼロのアサーションです
perl ワンライナーでの使用:
perl -pe 's/(?<=X)(?=X)/o/g' inputfile
場所:
<ブロック引用>
-p
Perl に、現在の行を暗黙的に出力してプログラムの周りをループさせる
ループ回答は、あなたが求めていることを行うための一般的な方法です.
ただし、データの場合、GNU を使用していると仮定すると、次のように簡単に実行できます。
sed 's/\B/o/g'
\b
と \B
オプションは正規表現の拡張子です:
\b
単語の境界、つまり「単語」の文字から「単語以外」の文字への移行、またはその逆に一致します\B
\b
の反対に一致します .つまり、単語の「内側」のギャップ。これにより、必要に応じて単語の内側に文字を挿入できますが、外側には挿入できません。
オンラインで試してみてください。
これは、入力文字が実際にはすべて「単語」文字であることを前提としています。
あるいは、GNU sed を持っていない場合、または入力文字がすべて「単語」文字ではない場合でも、ループせずに目標を達成できます:
sed 's/./&o/g;s/o$//'
これは単に o
を配置するだけです すべての文字の後、最後の o
を削除します 文字列から。
オンラインで試してみてください。