Saya menggunakan egrep -R
diikuti oleh ekspresi reguler yang berisi sekitar 10 serikat, jadi seperti:
.jpg | .png | .gif
dll. Ini berfungsi dengan baik, sekarang saya ingin mengganti semua string yang ditemukan dengan.bmp
Saya sedang memikirkan sesuatu seperti
egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form
jadi masalahnya di sini adalah bagaimana saya melakukan ekspresi reguler gabungan yang serupa sed
dan bagaimana cara memberitahukannya untuk menyimpan perubahan ke file yang mendapat masukan darinya.
Jawaban:
Gunakan perintah ini:
egrep
: temukan garis yang cocok menggunakan ekspresi reguler yang diperluas-l
: hanya mencantumkan nama file yang cocok-R
: mencari secara rekursif melalui semua direktori yang diberikan-Z
: gunakan\0
sebagai pemisah record"\.jpg|\.png|\.gif"
: cocok dengan salah satu string".jpg"
,".gif"
atau".png"
.
: memulai pencarian di direktori saat inixargs
: jalankan perintah dengan stdin sebagai argumen-0
: gunakan\0
sebagai pemisah record. Ini penting untuk mencocokkan-Z
dariegrep
dan untuk menghindari tertipu oleh spasi dan baris baru dalam nama file masukan.-l
: gunakan satu baris per perintah sebagai parametersed
: Yang s tream ed itor-i
: mengganti file input dengan output tanpa membuat cadangan-e
: gunakan argumen berikut sebagai ekspresi's/\.jpg\|\.gif\|\.png/.bmp/g'
: mengganti semua kemunculan string".jpg"
,".gif"
atau".png"
dengan".bmp"
sumber
sed -r
ekspresi reguler yang diperluas. Pada titik itu, pola akan cocok dengan yang digunakan di egrep, dan Anda mungkin ingin memasukkannya ke dalam variabel untuk digunakan kembali.Sejujurnya, saya suka sed untuk tugas yang sesuai, ini jelas merupakan tugas untuk perl - ini benar-benar lebih kuat untuk jenis satu baris ini, terutama untuk "menuliskannya kembali ke tempat asalnya" (
-i
sakelar perl melakukannya untuk Anda, dan secara opsional juga memungkinkan Anda menyimpan versi lama misalnya dengan menambahkan .bak, gunakan-i.bak
saja).daripada pekerjaan yang rumit di sed (jika mungkin ada) atau awk ...
sumber
sed
.. Saya rasa saya lupa beberapa flag ke sed atau itu memiliki keterbatasan.Cara lain untuk melakukan ini
Beberapa bantuan terkait perintah di atas
Find akan melakukan pencarian untuk Anda pada direktori saat ini yang ditunjukkan oleh
.
-name
nama file dalam kasus saya pom.xml-nya dapat memberikan kartu liar.-exec
menjalankansed
editor aliran-i
abaikan kasuss
adalah untuk pengganti/4.6.0.../
String yang akan dicari/5.0.0.../
String yang akan digantisumber
Saya tidak bisa mendapatkan perintah apa pun di halaman ini untuk bekerja untuk saya: solusi sed menambahkan baris baru ke akhir semua file yang diproses, dan solusi perl tidak dapat menerima cukup argumen dari find. Saya menemukan solusi ini yang berfungsi dengan sempurna:
Ini akan berulang ke bawah pohon direktori saat ini dan mengganti
search_regex
denganreplacement_string
di file apa pun yang diakhiri dengan.h
atau.m
.Saya juga pernah menggunakan rpl untuk tujuan ini di masa lalu.
sumber
coba sesuatu menggunakan for loop
tidak cantik, tapi harus dilakukan.
sumber
|while read i
pola akan memungkinkan streaming dan menghindari pembatasan panjang saat hasil egrep menjadi terlalu panjangKasus penggunaan saya adalah saya ingin mengganti
foo:/Drive_Letter
denganfoo:/bar/baz/xyz
Dalam kasus saya, saya dapat melakukannya dengan kode berikut. Saya berada di lokasi direktori yang sama di mana ada banyak file.berharap itu membantu.
PEMBARUAN s | foo: / Drive_letter: | foo: / ba / baz / xyz | g
sumber
sed 's|foo:/Drive_letter:|foo:/ba/baz/xyz|g'