Zaten tırnaklarla çevrili bir sed ifadesinde tek bir alıntıdan nasıl kaçılır?
Örneğin:
sed 's/ones/one's/' <<< 'ones thing'
Zaten tırnaklarla çevrili bir sed ifadesinde tek bir alıntıdan nasıl kaçılır?
Örneğin:
sed 's/ones/one's/' <<< 'ones thing'
Yanıtlar:
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
sed -i
, belirli bir neden?
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!
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.
En iyi yol kullanmaktır $'some string with \' quotes \''
Örneğin:
sed $'s/ones/two\'s/' <<< 'ones thing'
$'string'
Bash'e özgüdür, bu nedenle POSIX kabuğuna taşınabilir değildir.
bash
Spesifik değil . Ayrıca içinde de mevcuttur ksh
ve zsh
evet, 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.
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
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.ts
açı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.
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ı.
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