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:
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 \''
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
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.
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.
Jawaban:
Mengutip
sed
kode dengan tanda kutip ganda:Saya tidak suka kode melarikan diri dengan ratusan garis miring terbalik - sakit mata saya. Biasanya saya lakukan dengan cara ini:
sumber
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'
Ada 3 string dalam ekspresi sed, yang kemudian disatukan oleh shell:
sed 's/ones/two'
\'
's/'
Semoga itu bisa membantu orang lain!
sumber
sed 's/ones/two''s/' <<< 'ones thing'
Tidak, itu menghasilkantwos 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:
sumber
$'string'
adalah khusus Bash, jadi tidak portabel ke shell POSIX.bash
spesifik. Ini juga tersedia diksh
danzsh
, 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.
Ia bekerja dengan file juga.
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.
sumber
Ini adalah jenis masuk akal tapi aku tidak bisa mendapatkan
\'
dised 's/ones/one\'s/'
bekerja. Saya mencari ini untuk membuat skrip shell yang secara otomatis akan ditambahkanimport 'hammerjs';
kesrc/main.ts
file saya dengan Angular.Apa yang saya lakukan untuk bekerja adalah ini:
Jadi untuk contoh di atas, itu akan menjadi:
Saya tidak tahu mengapa
\'
tidak bekerja dengan sendirinya, tetapi itu dia.sumber
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.sumber
Beberapa pelarian di terminal AppleMacOSX gagal jadi:
sed 's|ones|one'$(echo -e "\x27")'s|1' <<<'ones thing'
sumber
gunakan pemisah string alternatif seperti ":" untuk menghindari kebingungan dengan garis miring yang berbeda
atau jika Anda ingin menyoroti kutipan tunggal tersebut
keduanya kembali
sumber