Sed'de tek alıntıdan nasıl kaçılır?


Yanıtlar:


150

Alıntı sedçift tırnak ile kodları:

    $ sed "s/ones/one's/"<<<"ones thing"   
    one's thing

Yüzlerce ters eğik çizgi ile kaçan kodlardan hoşlanmıyorum - gözlerimi acıtıyor. Genellikle şu şekilde yaparım:

    $ sed 's/ones/one\x27s/'<<<"ones thing"
    one's thing

7
Bu işe yaramıyor gibi görünüyor sed -i, belirli bir neden?
SamAko

Çift tırnaklı çevreleyen sed komutlarının, bu komutların kabuk tarafından enterpolasyonuna izin verdiği ve öngörülemeyen sorunlara yol açabileceği unutulmamalıdır.
36'da potong

38

Bir hile, bitişik dizelerin kabuk dizesi birleştirmesini kullanmak ve kabuk kaçışını kullanarak gömülü alıntıdan kaçmaktır:

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

two's thing

Sed ifadesinde, kabuğun daha sonra birbirine diktiği 3 dize vardır:

sed 's/ones/two'

\'

's/'

Umarım bu başka birine yardımcı olur!


belki daha kolay bir varyant: sed 's / one / two''s /' <<< 'one thing'
gregory

@gregory: sed 's/ones/two''s/' <<< 'ones thing'Hayır, bu çıktı twos thing. 'Çıktıda eksik . Bunu bu cevapta anlatılan şekilde yapmalısın.
wisbucky

@wisbucky zsh üzerinde kullandığım sed sürümüyle (FreeBSD / macOS), kesinlikle "iki şey" çıktısı veriyor.
gregory

Bana haber vererek büyük yardım et, sonra kabuklarını birbirine diker.
Prateek Gupta

6

En iyi yol kullanmaktır $'some string with \' quotes \''

Örneğin:

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

3
C stili $'string'Bash'e özgüdür, bu nedenle POSIX kabuğuna taşınabilir değildir.
2016

bashSpesifik değil . Ayrıca içinde de mevcuttur kshve zshevet, POSIX'in bir uzantısıdır, taşınabilir bir komut dosyası yazmıyorsanız sorun değil. Tek dezavantajı, kullandığınız diğer ters eğik çizgilerden de kaçınmanız gerektiğidir.
dannyw

6

Sed komutunun dışında çift tırnak kullanın.

$ sed "s/ones/one's/" <<< 'ones thing'
one's thing

Dosyalarla da çalışır.

$ echo 'ones thing' > testfile
$ sed -i "s/ones/one's/" testfile
$ cat testfile
one's thing

Dizenin içinde tek ve çift ​​tırnak işaretleri varsa , bu da sorun değil. Çift tırnaklardan kaçın.

Örneğin, bu dosya hem tek hem de çift tırnak içeren bir dize içerir. Sed'i tek bir alıntı eklemek ve bazı çift tırnakları kaldırmak için kullanacağım.

$ 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

Teşekkürler! Regex'i seviyorum, sed'i seviyorum ve şimdi seni seviyorum <3
Gabriel A.Zorrilla

3

Bu tür saçma ama alamadım \'içinde sed 's/ones/one\'s/'işe. Ben otomatik katacak bir kabuk yapmak için bu kadar bakıyordu import 'hammerjs';benim için src/main.tsaçısal kayıtlarında.

İşe geldiğim şey şuydu:

apost=\'
sed -i '' '/environments/a\
import '$apost'hammerjs'$apost';' src/main.ts

Yani yukarıdaki örnek şöyle olacaktır:

apost=\'
sed 's/ones/one'$apost's/'

Neden \'kendi kendine çalışmayacağına dair hiçbir fikrim yok , ama işte burada.



0

Bunun kulağa polis gibi geleceğini biliyorum, ancak dizede hem tek hem de çift tırnak varken asla çalışamazdım. Benim gibi sorun yaşayan acemilere yardım etmek için bir seçenek dizeyi bölmektir. 100'den fazla index.hmtl dosyasındaki kodu değiştirmek zorunda kaldım. Dizelerin hem tek hem de çift tırnak işaretleri vardı, bu yüzden dizeyi böldüm ve ilk bloğu ile <!--ve ikinci bloğu ile değiştirdim -->. İndex.html dosyalarımı karıştırdı ama işe yaradı.


0

AppleMacOSX terminallerindeki bazı çıkışlar başarısız oluyor, bu nedenle:

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


0

farklı eğik çizgilerle karışıklığı önlemek için ":" gibi alternatif bir dize ayırıcı kullanın

sed "s:ones:one's:" <<< 'ones thing'

veya tek alıntıyı vurgulamak isterseniz

sed "s:ones:one\'s:" <<< 'ones thing'

ikisi de geri döner

one's thing
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.