Jak uciec od pojedynczego cudzysłowu w sed?

Odpowiedzi:

149

Cytując sedkody 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
Kent
źródło
7
Z sed -ijakiegoś konkretnego powodu to nie działa ?
SamAko
Należy zauważyć, że otoczenie poleceń sed podwójnymi cudzysłowami umożliwia interpolację tych poleceń przez powłokę i może prowadzić do nieprzewidzianych problemów.
potong
38

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!

Thomas Bratt
źródło
być może łatwiejszy wariant: sed 's / one / two''s /' <<< 'one thing'
gregory
@gregory: 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.
wisbucky
@wisbucky Z wersją seda, której używam (FreeBSD / macOS) na zsh, zdecydowanie wyświetla "dwie rzeczy".
gregory
wielka pomoc człowieku, dając mi znać, muszla, a następnie zszywa razem.
Prateek Gupta
6

Najlepszym sposobem jest użycie $'some string with \' quotes \''

na przykład:

sed $'s/ones/two\'s/' <<< 'ones thing'
John C.
źródło
3
Styl C $'string'jest specyficzny dla Bash, więc nie jest przenośny do powłoki POSIX.
tripleee
To nie jest bashkonkretne. Jest również dostępny w kshi 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.
Dannyw
6

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
Stef Forrester
źródło
Dzięki! Uwielbiam wyrażenia regularne, uwielbiam sed, a teraz kocham cię <3
Gabriel A. Zorrilla
3

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

Ambrown
źródło
0

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

mcmacerson
źródło
0

Niektóre ucieczki na terminalach AppleMacOSX zawodzą, więc:

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

PaSe
źródło
0

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
brainelectronics
źródło