Saya menjalankan beberapa perintah substitusi sebagai inti dari skrip colorize untuk maven . Salah satu sed
perintah menggunakan ekspresi reguler yang berfungsi menemukan di shell seperti yang dibahas di sini . Implementasi saat ini (tidak berfungsi) dapat ditemukan di sini .
Ketika saya memasukkan salah satu varian perintah ke dalam skrip, perilaku yang berbeda terjadi:
Varian 1:
$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"
Diadaptasi ke skrip:
-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \
Kesalahan: Shell mengeluarkan informasi yang sama seperti jika saya mengetik $ sed
. Aneh!?
Varian 2:
$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"
Diadaptasi ke skrip:
-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \
Kesalahan:
sed: -e ekspresi # 7, karakter 59: referensi tidak valid \ 1 pada RHS perintah `s '
regex
sed
substitution
JJD
sumber
sumber
-i
(edit di opsi tempat) dengan-re
, menghasilkan-ire
(sehingga-i
memakanre
fragmen sebagaiSUFFIX
argumennya dan karenanya mode regex yang diperpanjang tidak diaktifkan); mengubahnya untuk-i -re
memperbaiki masalah.'
dan tanda kutip ganda"
diperlakukan sedikit berbeda, terutama saat menafsirkan$vars
. Misalnya:sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"
berfungsi, tetapi:sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'
tidak.Jawaban:
Apakah Anda tidak perlu benar-benar menangkapnya agar berfungsi? yaitu untuk varian 2:
(Catatan: belum teruji)
Tanpa -r argumen referensi-belakang (seperti \ 1) tidak akan berfungsi.
sumber
-r
pilihan untuk muncul sed menjadi diperlukan untuk back-referensi bekerja. Misalnyased -e 's/([[:digit:]])/is a digit/'
berfungsi tetapised -e 's/([[:digit:]])/\1 is a digit/
menghasilkan kesalahan asli tanpa-r
sed. CATATAN: pemanggilan pertama sed mencari literal(<digit>)
dan bukan grup tangkap.-ire
alih-alih menggunakan-ri
. Urutan penting :-)Kesalahan ini umum terjadi pada tanda kurung yang tidak di-escape. Lari mereka dan coba lagi.
Sebagai contoh:
Harus di-escape dengan garis miring terbalik sebelum setiap tanda kurung:
sumber
-r
Anda tidak harus keluar dari tanda kurung.Jika opsi
-r
/--regexp-extended
tidak tersedia, tanda kurung pengambilan harus di-escape.sumber
Anda perlu melarikan diri
/
setelah.
Atau jika Anda tidak ingin khawatir melarikan diri, gunakan
|
EDIT:
sumber
sed: -e expression #7, char 58: Invalid range end
. Jawaban @Denis berhasil.