Anda dapat melakukan:
> echo XXXX | sed -e ':loop' -e 's/XX/XoX/g' -e 't loop'
XoXoXoX
Dengan:
-e ':loop'
:Membuat label "lingkaran"-e 't loop'
:Lompat ke label "loop" jika penggantian sebelumnya berhasil
Dalam kasus khusus ini, lihat ke depan atau ke belakang akan berguna. Saya pikir GNU sed
tidak mendukung ini. Dengan perl
:
perl -ne 's/X(?=X)/Xo/g; print;'
Anda juga dapat menggunakan lookbehind dan lookahead seperti:
s/(?<=X)(?=X)/o/g
Dimana:
(?<=X)
adalah tampilan positif di belakang, pernyataan panjang nol yang memastikan kita memiliki X sebelum posisi saat ini
(?=X)
adalah pandangan ke depan yang positif, pernyataan panjang-nol yang memastikan kita memiliki X setelah posisi saat ini
Menggunakan dalam perl one-liner:
perl -pe 's/(?<=X)(?=X)/o/g' inputfile
Dimana:
-p
menyebabkan Perl menganggap perulangan di sekitar program dengan cetakan implisit dari baris saat ini
Jawaban berulang adalah cara umum untuk melakukan apa yang Anda minta.
Namun dalam hal data Anda, dengan asumsi Anda menggunakan GNU, Anda cukup melakukannya:
sed 's/\B/o/g'
\b
dan \B
opsinya adalah ekstensi regex:
\b
cocok dengan batas kata, yaitu transisi dari karakter "kata" ke karakter "bukan kata", atau sebaliknya\B
cocok dengan kebalikan dari\b
. yaitu celah kata "di dalam". Hal ini memungkinkan kita untuk menyisipkan karakter di dalam kata tetapi tidak di luarnya, sesuai kebutuhan.
Cobalah online.
Ini mengasumsikan bahwa karakter input sebenarnya adalah semua karakter "kata".
Alternatifnya, jika Anda tidak memiliki GNU sed, atau jika karakter input tidak semuanya karakter "kata", Anda masih dapat mencapai tujuan tanpa mengulang:
sed 's/./&o/g;s/o$//'
Ini hanya menempatkan o
setelah setiap karakter dan kemudian menghapus o
terakhir dari string.
Cobalah online.