Bagaimana cara menghindari satu kutipan dalam ekspresi sed yang sudah dikelilingi oleh tanda kutip?
Sebagai contoh:
sed 's/ones/one's/' <<< 'ones thing'
Bagaimana cara menghindari satu kutipan dalam ekspresi sed yang sudah dikelilingi oleh tanda kutip?
Sebagai contoh:
sed 's/ones/one's/' <<< 'ones thing'
Jawaban:
Mengutip sed
kode dengan tanda kutip ganda:
$ sed "s/ones/one's/"<<<"ones thing"
one's thing
Saya tidak suka kode melarikan diri dengan ratusan garis miring terbalik - sakit mata saya. Biasanya saya lakukan dengan cara ini:
$ sed 's/ones/one\x27s/'<<<"ones thing"
one's thing
sed -i
, ada alasan khusus?
Salah satu triknya adalah dengan menggunakan rangkaian string shell dari string yang berdekatan dan keluar dari kutipan yang disematkan menggunakan shell escaping:
sed 's/ones/two'\''s/' <<< 'ones thing'
two's thing
Ada 3 string dalam ekspresi sed, yang kemudian disatukan oleh shell:
sed 's/ones/two'
\'
's/'
Semoga itu bisa membantu orang lain!
sed 's/ones/two''s/' <<< 'ones thing'
Tidak, itu menghasilkan twos thing
. Ini kehilangan '
dalam output. Anda harus melakukannya dengan cara yang dijelaskan dalam jawaban ini.
Cara terbaik adalah dengan menggunakan $'some string with \' quotes \''
misalnya:
sed $'s/ones/two\'s/' <<< 'ones thing'
$'string'
adalah khusus Bash, jadi tidak portabel ke shell POSIX.
bash
spesifik. Ini juga tersedia di ksh
dan zsh
, tapi ya, ini adalah ekstensi untuk POSIX, yang bagus jika Anda tidak menulis skrip portabel. Satu-satunya downside adalah Anda harus menghindari garis miring terbalik lain yang Anda gunakan juga.
Cukup gunakan tanda kutip ganda di luar perintah sed.
$ sed "s/ones/one's/" <<< 'ones thing'
one's thing
Ia bekerja dengan file juga.
$ echo 'ones thing' > testfile
$ sed -i "s/ones/one's/" testfile
$ cat testfile
one's thing
Jika Anda memiliki tanda kutip tunggal dan ganda di dalam string, tidak apa-apa juga. Hindari tanda kutip ganda.
Misalnya, file ini berisi string dengan tanda kutip tunggal dan ganda. Saya akan menggunakan sed untuk menambahkan satu kutipan dan menghapus beberapa tanda kutip ganda.
$ cat testfile
"it's more than ones thing"
$ sed -i "s/\"it's more than ones thing\"/it's more than one's thing/" testfile
$ cat testfile
it's more than one's thing
Ini adalah jenis masuk akal tapi aku tidak bisa mendapatkan \'
di sed 's/ones/one\'s/'
bekerja. Saya mencari ini untuk membuat skrip shell yang secara otomatis akan ditambahkan import 'hammerjs';
ke src/main.ts
file saya dengan Angular.
Apa yang saya lakukan untuk bekerja adalah ini:
apost=\'
sed -i '' '/environments/a\
import '$apost'hammerjs'$apost';' src/main.ts
Jadi untuk contoh di atas, itu akan menjadi:
apost=\'
sed 's/ones/one'$apost's/'
Saya tidak tahu mengapa \'
tidak bekerja dengan sendirinya, tetapi itu dia.
Saya tahu ini akan terdengar seperti polisi tetapi saya tidak pernah bisa bekerja ketika ada tanda kutip tunggal dan ganda dalam string. Untuk membantu pemula seperti saya yang mengalami masalah, salah satu opsinya adalah dengan memisahkan talinya. Saya harus mengganti kode di lebih dari 100 file index.hmtl. Stringnya memiliki tanda kutip tunggal dan ganda jadi saya hanya membagi string dan mengganti blok pertama dengan
<!--
dan blok kedua dengan -->
. Itu mengacaukan file index.html saya tetapi berhasil.
gunakan pemisah string alternatif seperti ":" untuk menghindari kebingungan dengan garis miring yang berbeda
sed "s:ones:one's:" <<< 'ones thing'
atau jika Anda ingin menyoroti kutipan tunggal tersebut
sed "s:ones:one\'s:" <<< 'ones thing'
keduanya kembali
one's thing