Saya memiliki file yang berisi banyak baris xml. Saya ingin mengganti bagian file tertentu. Beberapa bagian file berisi tanda kutip ( "
) yang ingin saya ganti. Saya telah mencoba untuk melarikan diri dari tanda kutip \
, tetapi saya tidak berpikir ini berfungsi berdasarkan hasil file saya.
Berikut adalah contoh dari salah satu perintah sed saya:
sed -e "s/\"text\"/'text'/ig" file.xml > temp.tmp
Apakah ini cara Anda menghindari tanda kutip dalam perintah sed atau apakah saya melakukan sesuatu yang salah?
"text"
dengan'text'
. Tentu saja tidak akan melakukan apa pun untuk itu"othertext"
. Tampilkan beberapa jalur input, output yang sesuai yang tidak diinginkan, dan jelaskan output apa yang Anda inginkan.\"
apakah cara yang benar untuk menghindari tanda kutip dalam perintah sed?"
. Tetapi perintah shell Anda menggunakan string yang dikutip ganda, dan\"
benar di sana. Thesed
Program melihats/"text"/'text'/ig
sebagai argumen untuk-e
.s/\"text\" /'text'/ig
Apakah ia hanya menemukan"text"
spasi setelahnya?sed
adalah alat yang tepat untuk pekerjaan itu, mungkin Anda ingin parser XML.Jawaban:
Dua tips:
Anda tidak dapat melepaskan diri dari kutipan tunggal dalam string yang dikutip dengan kutipan tunggal. Jadi, Anda harus menutup kutipan, menambahkan kutipan lolos, lalu buka kutipan lagi. Yaitu
'foo'\''bar'
:, yang terurai sebagai:'foo'
dikutipfoo
\'
melarikan diri'
'bar'
dikutipbar
menghasilkan
foo'bar
./
sed. Saya menemukan bahwa menggunakan/
dan\
dalam ekspresi sed yang sama membuatnya sulit dibaca.Misalnya, untuk menghapus tanda kutip dari file ini:
Dengan dua tip saya di atas, perintah yang dapat Anda gunakan untuk menghapus tanda kutip ganda dan tunggal adalah:
Berdasarkan tip pertama saya, shell mengurangi argumen sed kedua (yaitu, string setelah
-e
) kes|["']||g
dan meneruskan string itu ke sed. Berdasarkan tip kedua saya, sed memperlakukan ini sama dengans/['"]//g
. Itu berartiAnda mungkin memerlukan sesuatu yang lebih kompleks dari ini untuk melakukan apa yang Anda inginkan, tetapi ini adalah permulaan.
sumber
'foo'\''bar'
kita gunakan'foo'"'"'bar'
.Saya memiliki port Windows utilitas unix sehingga perintah terlihat sedikit berbeda tapi saya punya file csv dengan koma dan tanda kutip. Dengan menggunakan utas ini sebagai panduan, saya dapat menghapus tanda kutip melalui perintah ini:
sumber