GNU/Linux >> Linux の 問題 >  >> Linux

文字を再帰的にsedに置き換える方法は?

できること:

> 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 を削除します 文字列から。

オンラインで試してみてください。


Linux
  1. Sed -i(インプレース編集)で移植性を実現するにはどうすればよいですか?

  2. Sedを使用して複数行の文字列を置き換える方法は?

  3. 文字列をSedのスラッシュを含む文字列に置き換える方法は?

  1. SedまたはExを使用してブロック(複数行コード)を新しいテキストブロック(コード)に置き換える方法は?

  2. Sedは改行文字を置き換えることができますか?

  3. 特殊文字でSedを使用していますか?

  1. GrubをBurgに置き換える方法は?

  2. 国際文字で sed が失敗する理由とその修正方法は?

  3. 再帰的にgrepするにはどうすればよいですか?