Bagaimana cara menghindari kutipan tunggal di sed?


Jawaban:


151

Mengutip sedkode 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

7
Ini sepertinya tidak berhasil sed -i, ada alasan khusus?
SamAko

Perlu dicatat bahwa perintah sed yang mengelilingi dengan tanda kutip ganda memungkinkan perintah tersebut diinterpolasi oleh shell dan dapat menyebabkan masalah yang tidak terduga.
potong

38

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!


mungkin varian yang lebih mudah: sed 's / ones / two''s /' <<< 'ones thing'
gregory

@gregory: 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.
wisbucky

@wisbucky Dengan versi sed yang saya gunakan (FreeBSD / macOS) di zsh, pasti menghasilkan "dua hal."
gregory

sangat membantu pria dengan memberi tahu saya, cangkang lalu jahitan bersama.
Prateek Gupta

7

Cara terbaik adalah dengan menggunakan $'some string with \' quotes \''

misalnya:

sed $'s/ones/two\'s/' <<< 'ones thing'

3
C-style $'string'adalah khusus Bash, jadi tidak portabel ke shell POSIX.
tripleee

Itu tidak bashspesifik. Ini juga tersedia di kshdan 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.
dannyw

6

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

Terima kasih! Saya suka regex, cinta sed dan sekarang saya mencintaimu <3
Gabriel A. Zorrilla

3

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.tsfile 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.



0

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.


0

Beberapa pelarian di terminal AppleMacOSX gagal jadi:

sed 's|ones|one'$(echo -e "\x27")'s|1' <<<'ones thing'


0

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.