GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mengganti karakter dengan sed secara rekursif?

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.


Linux
  1. Bagaimana Cara Mengganti String Dalam File?

  2. Bagaimana Mencapai Portabilitas Dengan Sed -i (Pengeditan di Tempat)?

  3. Bagaimana Cara Menggunakan Sed Untuk Mengganti String Multi-baris?

  1. Bagaimana Mengganti String Dengan String Yang Mengandung Slash Dengan Sed?

  2. Bagaimana Cara Menggunakan Sed Atau Ex Untuk Mengganti Blok (Kode multi-baris) Dengan Blok Teks (kode) Baru?

  3. Bisakah Sed Mengganti Karakter Baris Baru?

  1. Bagaimana Mengganti Grub Dengan Burg?

  2. Bagaimana cara mengganti MySQL dengan MariaDB di CentOS 6

  3. Ganti kata dengan yang lain di bash