Misalkan saya memiliki file yang berisi banyak kemunculan StringA dan StringB. Saya ingin mengganti semua kemunculan StringA dengan StringB, dan (secara bersamaan) semua kemunculan StringB dengan StringA.
Saat ini, saya sedang melakukan sesuatu seperti
cat file.txt | sed 's/StringB/StringC/g' | sed 's/StringA/StringB/g' | sed 's/StringC/StringA/g'
Masalah dengan pendekatan ini adalah bahwa ia menganggap StringC tidak terjadi dalam file. Meskipun ini bukan masalah dalam praktiknya, solusi ini masih terasa kotor - yaitu, rasanya seperti kesempatan untuk mempelajari lebih banyak unix magic. :)
sed: can't read s/StringB/StringA/g: No such file or directory
. Sepertinya-e t PATTERN
tidak dipahami dengan baik.-e
sebelums
perintah kedua . Saya sudah memperbaiki jawaban saya.Saya pikir pendekatan Anda baik-baik saja, Anda hanya perlu menggunakan sesuatu yang lain daripada string, sesuatu yang tidak dapat terjadi dalam garis (dalam ruang pola). Kandidat terbaik adalah
\n
ewline.Biasanya, tidak ada baris input dalam ruang pola yang akan mengandung karakter itu sehingga, untuk menukar semua kemunculan
THIS
danTHAT
dalam file, Anda bisa menjalankan:atau, jika sed Anda mendukung
\n
RHS juga:sumber
sed
mendukung pelolosan tertentu atau tidak menjadi jauh lebih penting jika Anda menyiapkan beberapa makro sebelumnya. Sepertiset /THIS /THAT "$(printf \\n/)"; sed "s/$2/\\$4g;s/$3$2/g;s/\\n$3/g"
- agak bodoh di sini, memang, tapi itu jauh lebih masuk akal ketika beberapa kali - terutama untuk kelas char dan sejenisnya.sed
, garpu konstan di atase
adalah kinduva nightmare. Pada nada yang berbeda - Saya sudah bermain denganpaste
sepanjang hari. Saya membuat parser pilihan - seperticolumn
. Itu hanya garis gens untuk string input dan hal-hal string bersama-sama.Saya pikir ini sangat valid untuk menggunakan string "nonce" untuk bertukar dua kata. Jika Anda menginginkan solusi yang lebih umum, Anda dapat melakukan sesuatu seperti:
Itu menghasilkan
Perhatikan bahwa Anda memerlukan dua subtitusi tambahan di sini untuk menghindari penggantian
x_x
jika Anda memiliki string "x_x". Tetapi itu pun masih tampak lebih sederhana daripadaawk
solusi bagi saya.sumber
_
, seseorang perlu menyesuaikan_
sendiri (pilih karakter lain) atau string yang merepotkan (tampils/_/__/g
di atasnya sebelumnya, tampaknya lebih baik). Solusi Anda, sebagaimana adanya, tidak dapat diterapkan secara membabi buta untuk menukar string yang sewenang-wenang.s/_/__/g
sebelumnya. Mungkin hanya menunjukkan testcase yang gagal._
, maka katakanlah gantiy_ou
denganme
. Ya itu benar, kita harus menyadari hal itu dany__ou
mengungkapkannya. Sebuah skrip yang mengambil penggantian sebagai parameter input juga harus memperhitungkannya.