saya sudah
Memasukkan:
NISHA =\455
Keluaran:
NISHA = 455
Saya ingin menghapus \
dari output. Saya mencoba menggunakan perintah sed "s/[\]//g" P
tetapi tidak berfungsi dan ditandai kesalahan:
character found after backslash is not meaningful
sed
regular-expression
yisha
sumber
sumber
sed
(atau mungkin Anda menjalankan perintah itu dari shell non-POSIX?). Anda tidak perlused
meskipun,tr
cukup:tr -d '\\' < P
.Jawaban:
Anda bisa mengganti backslash dengan spasi seperti yang Anda tunjukkan dalam hasil contoh:
atau Anda dapat menghapusnya seperti yang Anda tunjukkan dalam kode Anda:
Karakter spesial
Ada kemungkinan masalah dengan melarikan diri backslash untuk membatalkan arti khusus. Backslash adalah karakter khusus yang digunakan untuk melarikan diri baik dalam shell maupun ekspresi reguler.
Perintah yang Anda ketikkan ke baris perintah shell atau skrip pertama kali diproses oleh shell yang mengartikan makna khusus karakter dan pelolosannya. Hasilnya kemudian diteruskan ke perintah yang akan dieksekusi (seperti
sed
) yang melakukan interpretasi karakternya sendiri. Ketika Anda membangun sebuah perintah, prosedur mentalnya adalah sebaliknya: pertama-tama tambahkan escaping untuk regex kemudian tambahkan escaping untuk shell.Dalam sebuah regex (input ke perintah seperti
sed
,grep
dll.) Backslash dapat lolos dengan backslash seperti ini:\\
dan Anda juga dapat menggunakan ekspresi set[\]
seperti yang Anda gunakan karena ada backslash kehilangan arti khusus.Dalam sebuah shell (seperti
bash
) Anda dapat menghindari backslash dengan backslash. Jadi alih-alih\
menulis\\
. Menutup string antara tanda kutip ganda"
membuat perilaku backslash lebih rumit <1> tetapi double backslash masih akan menghasilkan backslash tunggal. Menutup string di antara tanda kutip tunggal'
membuat setiap karakter diperlakukan secara harfiah kecuali'
.Jika Anda ingin menggunakan tanda kutip ganda , Anda dapat menggunakan salah satu dari berikut ini:
sed "s/\\\\//g"
- melarikan diri\
dengan\
di shell, dan melarikan diri setiap\
di regex lagi. Faktanya, tanda kutip ganda tidak diperlukan dalam kasus ini karena setiap karakter khusus lolos dengan benar.sed "s/[\\]//g"
- Melarikan diri di shell dengan backslash\
dan di regex gunakan satu set[
]
.sed "s/[\]//g"
- Ya, contoh Anda harus bekerja di lingkungan yang sesuai dengan POSIX! Antara tanda kutip ganda\
mewakili dirinya sendiri kecuali mendahului karakter khusus dalam konteks tanda kutip ganda:$`"\
atau baris baru. Sepertinya dalam kasus Anda shell ataused
tidak mengikuti standar POSIX.Dengan tanda kutip tunggal Anda juga dapat menggunakan string seperti yang Anda gunakan atau dengan cara yang lebih pendek:
sed 's/[\]//g'
sed 's/\\//g'
sumber
Anda harus melarikan diri dari garis miring terbalik. Coba ini:
sumber
Jika Anda tidak ingin solusi sed, maka coba dengan perintah berikut:
sumber
Dalam awk, saya akan melakukan ini,
sumber
Tempatkan
\
sebelumnya\
seperti yang Anda lakukan dengan sebagian besar karakter khusus.sumber
g
bendera karena alasan yang tidak diketahui. Ini mengubah perilaku perintah tetapi perubahan seperti itu tidak diminta dalam pertanyaan. Kalau tidak, balasan Anda tidak membawa sesuatu yang baru dibandingkan dengan balasan sebelumnya.