Hapus garis miring terbalik dari file teks

10

saya sudah

Memasukkan:

 NISHA =\455  

Keluaran:

 NISHA = 455

Saya ingin menghapus \dari output. Saya mencoba menggunakan perintah sed "s/[\]//g" Ptetapi tidak berfungsi dan ditandai kesalahan:

character found after backslash is not meaningful
yisha
sumber
3
Anda tampaknya memiliki implementasi non-POSIX sed(atau mungkin Anda menjalankan perintah itu dari shell non-POSIX?). Anda tidak perlu sedmeskipun, trcukup: tr -d '\\' < P.
Stéphane Chazelas

Jawaban:

20

Anda bisa mengganti backslash dengan spasi seperti yang Anda tunjukkan dalam hasil contoh:

sed 's/\\/ /g'

atau Anda dapat menghapusnya seperti yang Anda tunjukkan dalam kode Anda:

sed 's/\\//g'

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.

  1. Dalam sebuah regex (input ke perintah seperti sed, grepdll.) Backslash dapat lolos dengan backslash seperti ini: \\dan Anda juga dapat menggunakan ekspresi set [\]seperti yang Anda gunakan karena ada backslash kehilangan arti khusus.

  2. 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 atau sedtidak 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'

pabouk
sumber
6

Anda harus melarikan diri dari garis miring terbalik. Coba ini:

sed 's/\\//g'
jherran
sumber
3

Jika Anda tidak ingin solusi sed, maka coba dengan perintah berikut:

$ echo "NISHA =\455"| awk -F'\' '{print $1 $2}'
$ echo "NISHA =\455"| tr '\\' ' '
$ echo "NISHA =\455"| tr -d '\\'
$ echo "NISHA =\455"| cut -c 1-7,9-11
αғsнιη
sumber
2

Dalam awk, saya akan melakukan ini,

$ echo 'NISHA =\455' | awk '{gsub(/\\/," ")}1'
NISHA = 455
Avinash Raj
sumber
1
sed 's/\\//'

Tempatkan \sebelumnya \seperti yang Anda lakukan dengan sebagian besar karakter khusus.

Nama tampilan
sumber
Anda telah menghilangkan gbendera 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.
pabouk