Saya perlu mengganti beberapa teks di dalam file teks dengan pengganti. Biasanya saya akan melakukan sesuatu seperti
sed -i 's/text/replacement/g' path/to/the/file
Masalahnya adalah bahwa kedua text
dan replacement
string kompleks yang mengandung tanda hubung, garis miring, blackslashes, kutipan dan sebagainya. Jika saya melarikan diri semua karakter yang diperlukan di text
dalam hal itu menjadi tidak dapat dibaca dengan cepat. Di sisi lain saya tidak perlu kekuatan ekspresi reguler: Saya hanya perlu mengganti teks secara harfiah.
Apakah ada cara untuk melakukan subtitusi teks tanpa menggunakan ekspresi reguler dengan beberapa perintah bash?
Agak sepele untuk menulis naskah yang melakukan ini, tetapi saya pikir sudah ada sesuatu yang sudah ada.
bash
regex
sed
text-editing
Andrea
sumber
sumber
find and replace all
bash
selalu dikirim dengan Microsoft Word? ;) Tidak .. Hanya bercanda. OP mungkin ingin melakukan ini pada mesin jarak jauh atau untuk banyak file.sed
, yang mungkin merupakan upaya yang sia-sia mengingat semua sakelar dan perbedaan platform.Jawaban:
Saat Anda tidak membutuhkan kekuatan ekspresi reguler, jangan gunakan itu. Ini baik saja.
Tapi, ini bukan ekspresi reguler .
sed 's|literal_pattern|replacement_string|g'
Jadi, jika
/
masalah Anda, gunakan|
dan Anda tidak perlu melarikan diri dari yang pertama.ps: tentang komentar, lihat juga jawaban Stackoverflow pada Escape a string for sed search pattern .
Pembaruan: Jika Anda baik-baik saja menggunakan Perl, coba
\Q
dan gunakan\E
ini,perl -pe 's|\Qliteral_pattern\E|replacement_string|g'
RedGrittyBrick
juga menyarankan trik serupa dengan sintaks Perl yang lebih kuat dalam komentar di sini.sumber
s|||
dans///
adalah bahwa karakter pemisah berbeda dan sehingga satu karakter tidak perlu melarikan diri. Anda bisa melakukan hal yang samas###
. Masalah sebenarnya di sini adalah bahwa OP tidak mau harus khawatir tentang melarikan diri dari isiliteral_pattern
(yang tidak literal sama sekali dan akan ditafsirkan sebagai sebuah regex).1234.*aaa
dengan solusi Anda itu lebih cocok dari yang dimaksudkan1234\.\*aaa
.Ini adalah satu-satunya solusi aman 100% di sini, karena:
sed
)}
char (dengan demikian, lebih unggul daripada solusi Perl yang dikirimkan)ENV['FIND']
digunakan, tidak$FIND
. Dengan$FIND
atau teks Anda digarisbawahi dalam kode Ruby, Anda dapat menemukan kesalahan sintaks jika string Anda berisi yang tidak terhapuskan'
.sumber
export FIND='find this; export REPLACE='replace with this';
dalam skrip bash saya sehinggaENV['FIND']
danENV['replace']
memiliki nilai yang diharapkan. Saya mengganti beberapa string terenkripsi yang sangat lama dalam sebuah file. Ini hanya tiketnya.The
replace
perintah akan melakukan hal ini.https://linux.die.net/man/1/replace
Ubah di tempat:
Untuk stdout:
Contoh:
The
replace
perintah datang dengan MySQL atau MariaDB.sumber
Anda juga dapat menggunakan
\Q
mekanisme perl untuk " mengutip (menonaktifkan) metakarakter pola "sumber
perl -pe 's(\Qyour */text/?goes"here")(replacement)' file
lihat skrip Perl saya. itu melakukan apa yang Anda butuhkan tanpa menggunakan ekspresi reguler reguler:
https://github.com/Samer-Al-iraqi/Linux-str_replace
sangat berguna bukan? Saya harus belajar Perl untuk melakukannya. karena saya benar-benar sangat membutuhkannya.
sumber
Anda dapat melakukannya dengan keluar dari pola Anda. Seperti ini:
Kredit untuk solusi ini ada di sini: https://stackoverflow.com/questions/407523/escape-a-string-for-a-sed-replace-pattern
Catatan1: ini hanya berfungsi untuk kata kunci yang tidak kosong. Kata kunci kosong tidak diterima oleh sed (
sed -e 's//replacement/'
).Note2: sayangnya, saya tidak tahu alat populer yang TIDAK akan menggunakan regexp-s untuk menyelesaikan masalah. Anda dapat menulis alat seperti itu di Rust atau C, tetapi tidak ada di sana secara default.
sumber
Saya mengumpulkan beberapa jawaban lain dan muncul dengan ini:
sumber
\n
. Ada solusi?Anda dapat menggunakan str_replace php :
Catatan: Anda masih harus lolos dari tanda kutip tunggal
'
dan ganda"
.sumber
Node.JS setara dengan @Nowaker:
sumber
Inilah satu lagi cara kerja "hampir".
Gunakan vi atau vim.
Buat file teks dengan subtitusi Anda di dalamnya:
kemudian jalankan vi atau vim dari commandline:
:% sno adalah perintah vi untuk melakukan pencarian dan penggantian tanpa sihir.
Saya adalah pemisah yang saya pilih.
: x menyimpan dan keluar vi.
Anda harus lolos dari garis miring terbalik '\' forwardslash '/' dapat diganti dengan misalnya tanda tanya '?' atau sesuatu yang tidak ada dalam pencarian Anda atau ganti-string, pipa '|' tidak bekerja untuk saya tho.
ref: https://stackoverflow.com/questions/6254820/perform-a-non-regex-search-replace-in-vim https://vim.fandom.com/wiki/Search_without_need_to_escape_slash http://linuxcommand.org/ lc3_man_pages / vim1.html
sumber