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:
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
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
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.
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ł.
Odpowiedzi:
Cytując
sed
kody z podwójnym cudzysłowie:Nie lubię uciekać przed kodami setkami odwrotnych ukośników - boli mnie oczy. Zwykle robię w ten sposób:
źródło
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'
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!
źródło
sed 's/ones/two''s/' <<< 'ones thing'
Nie, to wyświetlatwos 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:
źródło
$'string'
jest specyficzny dla Bash, więc nie jest przenośny do powłoki POSIX.bash
konkretne. Jest również dostępny wksh
izsh
, 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.
Działa też z plikami.
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.
źródło
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 dodaimport 'hammerjs';
do mojegosrc/main.ts
pliku za pomocą Angulara.To, co dostałem do pracy, to:
W powyższym przykładzie wyglądałoby to tak:
Nie mam pojęcia, dlaczego
\'
nie miałby działać sam, ale tak jest.źródło
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ł.źródło
Niektóre ucieczki na terminalach AppleMacOSX zawodzą, więc:
sed 's|ones|one'$(echo -e "\x27")'s|1' <<<'ones thing'
źródło
użyj alternatywnego separatora ciągów, takiego jak „:”, aby uniknąć pomyłki z różnymi ukośnikami
lub jeśli chcesz wyróżnić pojedynczy cytat
obie wracają
źródło