Misalkan saya memiliki string 'abbc' dan saya ingin mengganti:
- ab -> bc
- bc -> ab
Jika saya mencoba dua menggantikan hasilnya bukan yang saya inginkan:
echo 'abbc' | sed 's/ab/bc/g;s/bc/ab/g'
abab
Jadi apa perintah sed yang bisa saya gunakan untuk mengganti seperti di bawah ini?
echo abbc | sed SED_COMMAND
bcab
EDIT : Sebenarnya teks bisa memiliki lebih dari 2 pola dan saya tidak tahu berapa banyak pengganti yang akan saya butuhkan. Karena ada jawaban yang mengatakan bahwa itu sed
adalah editor aliran dan penggantinya rakus saya pikir saya perlu menggunakan beberapa bahasa skrip untuk itu.
g
bendera dari keduas///
perintah itu dan itu akan berhasil.ab
ataubc
pada input asli.Jawaban:
Mungkin kira-kira seperti ini:
Ganti
~
dengan karakter yang Anda tahu tidak akan ada di string.sumber
\x0
untuk~~
.g
perlu dan apa fungsinya?g
adalah untuk global - ia menggantikan semua instance dari pola di setiap baris, bukan hanya yang pertama (yang merupakan perilaku default).Saya selalu menggunakan banyak pernyataan dengan "-e"
$ sed -e 's:AND:\n&:g' -e 's:GROUP BY:\n&:g' -e 's:UNION:\n&:g' -e 's:FROM:\n&:g' file > readable.sql
Ini akan menambahkan '\ n' sebelum semua AND, GROUP BY, UNION dan FROM's, sedangkan '&' berarti string yang cocok dan '\ n &' berarti Anda ingin mengganti string yang cocok dengan '\ n' sebelum 'cocok' '
sumber
Berikut adalah variasi jawaban ooga yang berfungsi untuk beberapa pencarian dan mengganti pasangan tanpa harus memeriksa bagaimana nilai dapat digunakan kembali:
Berikut ini sebuah contoh:
sebelum:
setelah:
Perhatikan yang
\b
menunjukkan batas kata, yang mencegahnya________
dari mengganggu pencarian (Saya menggunakan GNU sed 4.2.2 di Ubuntu). Jika Anda tidak menggunakan pencarian batas kata, maka teknik ini mungkin tidak berfungsi.Perhatikan juga bahwa ini memberikan hasil yang sama seperti menghapus
s/________//g
dan menambahkan&& sed -i 's/________//g' path_to_your_files/*.txt
ke akhir perintah, tetapi tidak mengharuskan menentukan jalur dua kali.Variasi umum untuk ini adalah menggunakan
\x0
atau_\x0_
menggantikan________
jika Anda tahu bahwa tidak ada null yang muncul di file Anda, seperti yang disarankan jthill .sumber
sed 's/ab/xy/' | sed 's/cd/ab/' .....
)sed
adalah editor aliran. Ia mencari dan mengganti dengan rakus. Satu-satunya cara untuk melakukan apa yang Anda minta adalah menggunakan pola substitusi antara dan mengubahnya kembali pada akhirnya.echo 'abcd' | sed -e 's/ab/xy/;s/cd/ab/;s/xy/cd/'
sumber
Ini mungkin bekerja untuk Anda (sed GNU):
Ini menggunakan tabel pencarian yang disiapkan dan diadakan di ruang penahanan (HS) dan kemudian ditambahkan ke setiap baris. Penanda unik (dalam hal ini
\n
) diawali dengan awal baris dan digunakan sebagai metode untuk menabrak-sepanjang pencarian sepanjang garis. Setelah penanda mencapai ujung garis proses selesai dan dicetak tabel pencarian dan spidol dibuang.NB Tabel pencarian disiapkan pada awal dan penanda unik kedua (dalam hal ini
:
) dipilih agar tidak berbenturan dengan string substitusi.Dengan beberapa komentar:
Tabelnya berfungsi seperti ini:
sumber
Mungkin pendekatan yang lebih sederhana untuk kejadian pola tunggal yang dapat Anda coba seperti di bawah ini: echo 'abbc' | sed 's / ab / bc /; s / bc / ab / 2'
Output saya:
Untuk beberapa kejadian pola:
Contoh
Semoga ini membantu !!
sumber
Tcl memiliki builtin untuk ini
Ini berfungsi dengan menggerakkan string karakter pada satu waktu melakukan perbandingan string mulai dari posisi saat ini.
Dalam perl:
sumber
Ini
awk
berdasarkan oogassed
sumber