Jak uniknąć pojedynczego cudzysłowu w wyrażeniu sed, które jest już otoczone cudzysłowami?
Na przykład:
sed 's/ones/one's/' <<< 'ones thing'
Jak uniknąć pojedynczego cudzysłowu w wyrażeniu sed, które jest już otoczone cudzysłowami?
Na przykład:
sed 's/ones/one's/' <<< 'ones thing'
Odpowiedzi:
Cytując sed
kody z podwójnym cudzysłowie:
$ sed "s/ones/one's/"<<<"ones thing"
one's thing
Nie lubię uciekać przed kodami setkami odwrotnych ukośników - boli mnie oczy. Zwykle robię w ten sposób:
$ sed 's/ones/one\x27s/'<<<"ones thing"
one's thing
sed -i
jakiegoś konkretnego powodu to nie działa ?
Jedną sztuczką jest użycie konkatenacji łańcuchów powłoki sąsiednich ciągów i uniknięcie osadzonego cudzysłowu za pomocą znaku ucieczki powłoki:
sed 's/ones/two'\''s/' <<< 'ones thing'
two's thing
W wyrażeniu sed znajdują się 3 struny, które następnie zszywa powłoka:
sed 's/ones/two'
\'
's/'
Mam nadzieję, że to pomoże komuś innemu!
sed 's/ones/two''s/' <<< 'ones thing'
Nie, to wyświetla twos thing
. Brakuje '
na wyjściu. Musisz to zrobić w sposób opisany w tej odpowiedzi.
Najlepszym sposobem jest użycie $'some string with \' quotes \''
na przykład:
sed $'s/ones/two\'s/' <<< 'ones thing'
$'string'
jest specyficzny dla Bash, więc nie jest przenośny do powłoki POSIX.
bash
konkretne. Jest również dostępny w ksh
i zsh
, ale tak, jest rozszerzeniem POSIX, co jest w porządku, jeśli nie piszesz przenośnego skryptu. Jedynym minusem jest to, że musisz uciec przed innymi używanymi ukośnikami odwrotnymi.
Po prostu użyj podwójnych cudzysłowów na zewnątrz polecenia sed.
$ sed "s/ones/one's/" <<< 'ones thing'
one's thing
Działa też z plikami.
$ echo 'ones thing' > testfile
$ sed -i "s/ones/one's/" testfile
$ cat testfile
one's thing
Jeśli w ciągu znaków znajdują się pojedyncze i podwójne cudzysłowy, to też jest w porządku. Po prostu uniknij podwójnych cudzysłowów.
Na przykład ten plik zawiera ciąg znaków z pojedynczymi i podwójnymi cudzysłowami. Użyję seda, aby dodać pojedynczy cytat i usunąć niektóre podwójne cudzysłowy.
$ 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
Jest to rodzaj absurdu, ale nie mogłem dostać \'
się sed 's/ones/one\'s/'
do pracy. Szukałem tego, aby stworzyć skrypt powłoki, który automatycznie doda import 'hammerjs';
do mojego src/main.ts
pliku za pomocą Angulara.
To, co dostałem do pracy, to:
apost=\'
sed -i '' '/environments/a\
import '$apost'hammerjs'$apost';' src/main.ts
W powyższym przykładzie wyglądałoby to tak:
apost=\'
sed 's/ones/one'$apost's/'
Nie mam pojęcia, dlaczego \'
nie miałby działać sam, ale tak jest.
Wiem, że to zabrzmi jak policjant, ale nigdy nie mogłem uruchomić seda, gdy w ciągu znaków były zarówno pojedyncze, jak i podwójne cudzysłowy. Aby pomóc nowicjuszom, takim jak ja, którzy mają problemy, jedną z opcji jest podzielenie łańcucha. Musiałem wymienić kod w ponad 100 plikach index.hmtl. Ciągi miały zarówno pojedyncze, jak i podwójne cudzysłowy, więc po prostu podzieliłem ciąg i zastąpiłem pierwszy blok,
<!--
a drugi blok -->
. Zrobił bałagan w moich plikach index.html, ale zadziałał.
użyj alternatywnego separatora ciągów, takiego jak „:”, aby uniknąć pomyłki z różnymi ukośnikami
sed "s:ones:one's:" <<< 'ones thing'
lub jeśli chcesz wyróżnić pojedynczy cytat
sed "s:ones:one\'s:" <<< 'ones thing'
obie wracają
one's thing