Di bawah ini adalah potongan skrip shell dari skrip yang lebih besar. Ini menghapus tanda kutip dari string yang dipegang oleh variabel. Saya melakukannya dengan menggunakan sed, tetapi apakah ini efisien? Jika tidak, lalu apa cara yang efisien?
#!/bin/sh
opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp
sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$opt"
. Sintaks ini hanya akan menghapus qoutes ketika ada pasangan yang cocok.Jawaban:
Ada cara yang lebih sederhana dan lebih efisien, menggunakan fitur prefix / suffix shell asli:
${opt%\"}
akan menghapus suffix"
(lolos dengan backslash untuk mencegah interpretasi shell).${temp#\"}
akan menghapus awalan"
(lolos dengan backslash untuk mencegah interpretasi shell).Keuntungan lain adalah bahwa ia akan menghapus tanda kutip sekitarnya hanya jika ada tanda kutip sekitarnya.
BTW, solusi Anda selalu menghilangkan karakter pertama dan terakhir, apa pun itu (tentu saja, saya yakin Anda tahu data Anda, tetapi selalu lebih baik untuk memastikan apa yang Anda hapus).
Menggunakan sed:
(Versi yang ditingkatkan, seperti yang ditunjukkan oleh jfgagne, menyingkirkan gema)
Jadi itu menggantikan yang memimpin
"
dengan yang tidak ada, dan yang tertinggal"
dengan yang juga. Dalam doa yang sama (tidak perlu melakukan pipa dan memulai sed lain. Menggunakan-e
Anda dapat memiliki beberapa pemrosesan teks).sumber
sed -e 's/^"//' -e 's/"$//' <<< $opt
.sed
regex dapat digunakan, atau substitusi variabel dapat dibungkus dalam garis sesuatucase $opt in '"'*'"') ... do it ... ;; esac
sed 's/^"\|"$//g'
Gunakan tr untuk menghapus
"
:Catatan : Ini menghapus semua tanda kutip ganda, tidak hanya mengarah dan mengekor.
sumber
Ini akan menghapus semua tanda kutip ganda.
sumber
Don't remove this \" quote
. , .:-(
Ada cara mudah menggunakan xargs :
xargs menggunakan echo sebagai perintah default jika tidak ada perintah yang diberikan dan menghapus tanda kutip dari input. Lihat misalnya di sini .
sumber
echo '"quoted"' | xargs
->quoted
Anda dapat melakukannya hanya dengan satu panggilan ke
sed
:sumber
Cara terpendek - coba:
Ini benar-benar menghapus semua
"
s (tanda kutip ganda) dariopt
(apakah benar-benar akan ada lebih banyak tanda kutip selain di awal dan akhirnya? Jadi itu sebenarnya hal yang sama, dan jauh lebih singkat ;-))sumber
Jika Anda menggunakan jq dan mencoba menghapus tanda kutip dari hasilnya, jawaban lain akan berfungsi, tetapi ada cara yang lebih baik. Dengan menggunakan
-r
opsi, Anda dapat menampilkan hasilnya tanpa tanda kutip.sumber
jq
tetapi harap dicatat bahwa itu tidak berfungsi jika jq juga mengeluarkan keluaran ASCII dengan-a
(ini adalah bug di sisi jq)yq
juga memiliki-r
opsi:yq -r '.foo' file.yml
Memperbarui
Sebuah jawaban sederhana dan elegan dari Stripping tanda kutip tunggal dan ganda dalam string menggunakan perintah bash / standar Linux saja :
BAR=$(eval echo $BAR)
strip kutipan dariBAR
.================================================== ===========
Berdasarkan jawaban hueybois, saya menemukan fungsi ini setelah banyak mencoba-coba:
Jika Anda tidak ingin apa pun dicetak, Anda dapat mengirimkan eval ke pipa
/dev/null 2>&1
.Pemakaian:
sumber
Solusi termudah di Bash:
Ini disebut perluasan substring (lihat Manual Gnu Bash dan cari
${parameter:offset:length}
). Dalam contoh ini diperlukan substring daris
mulai di posisi 1 dan berakhir di posisi terakhir kedua. Hal ini disebabkan oleh fakta bahwa jikalength
nilai negatif itu ditafsirkan sebagai offset berjalan mundur dari akhirparameter
.sumber
Ini adalah cara yang paling berbeda tanpa menggunakan sed:
Atau
Keluaran:
Saya mendapat ini dari sumber .
sumber
Ada cara lain untuk melakukannya. Suka:
sumber
Versi saya
Fungsi menerima nama variabel dan tanda kutip di tempat. Itu hanya menghapus sepasang kutipan terkemuka dan tertinggal. Itu tidak memeriksa apakah kutipan tambahan lolos (didahului oleh
\
mana itu sendiri tidak lolos).Dalam pengalaman saya, fungsi utilitas string untuk keperluan umum seperti ini (saya punya perpustakaannya) paling efisien ketika memanipulasi string secara langsung, tidak menggunakan pencocokan pola apa pun dan terutama tidak membuat sub-shell, atau memanggil alat eksternal seperti
sed
,awk
ataugrep
.sumber
Saya tahu ini adalah pertanyaan yang sangat lama, tetapi di sini ada variasi sed yang lain, yang mungkin berguna bagi seseorang. Tidak seperti beberapa yang lain, itu hanya menggantikan tanda kutip ganda pada awal atau akhir ...
sumber