Como escapar das aspas simples no sed?

Respostas:

154

sedCódigos de citação com aspas duplas:

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

Não gosto de escapar de códigos com centenas de barras invertidas - machuca meus olhos. Normalmente eu faço desta forma:

    $ sed 's/ones/one\x27s/'<<<"ones thing"
    one's thing
Kent
fonte
7
Isso não parece funcionar sed -i, algum motivo particular?
SamAko,
1
Deve-se notar que cercar os comandos sed com aspas duplas permite que esses comandos sejam interpolados pelo shell e pode levar a problemas imprevistos.
potong,
38

Um truque é usar a concatenação de string de shell de strings adjacentes e escapar da citação incorporada usando escape de shell:

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

two's thing

Existem 3 cordas na expressão sed, que a casca então costura:

sed 's/ones/two'

\'

's/'

Espero que ajude mais alguém!

Thomas Bratt
fonte
talvez uma variante mais fácil: sed 's / uns / two''s /' <<< 'uns thing'
Gregory
@gregory: sed 's/ones/two''s/' <<< 'ones thing'Não, isso resulta twos thing. Está faltando o 'na saída. Você tem que fazer da maneira descrita nesta resposta.
wisbucky
@wisbucky Com a versão do sed que estou usando (FreeBSD / macOS) no zsh, ele definitivamente produz "coisa de dois".
Gregory
grande ajuda cara, deixando-me saber, shell, em seguida, pontos juntos.
Prateek Gupta
7

A melhor maneira é usar $'some string with \' quotes \''

por exemplo:

sed $'s/ones/two\'s/' <<< 'ones thing'
John C
fonte
3
O estilo C $'string'é específico do Bash, portanto não é portátil para o shell POSIX.
tripleee
Não é bashespecífico. Também está disponível em kshe zsh, mas sim, é uma extensão para POSIX, o que é bom se você não estiver escrevendo um script portátil. A única desvantagem é que você também precisa escapar de quaisquer outras barras invertidas.
dannyw
7

Basta usar aspas duplas fora do comando sed.

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

Também funciona com arquivos.

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

Se você tiver aspas simples e duplas dentro da string, tudo bem também. Basta escapar das aspas duplas.

Por exemplo, este arquivo contém uma string com aspas simples e duplas. Usarei o sed para adicionar aspas simples e remover algumas aspas duplas.

$ 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
fonte
Obrigado! Eu amo regex, amo sed e agora te amo <3
Gabriel A. Zorrilla
3

Este é tipo de absurdo, mas eu não poderia começar \'no sed 's/ones/one\'s/'ao trabalho. Eu estava procurando isso para fazer um script de shell que será adicionado automaticamente import 'hammerjs';ao meu src/main.tsarquivo com o Angular.

O que eu comecei a trabalhar foi o seguinte:

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

Portanto, para o exemplo acima, seria:

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

Não tenho ideia de por \'que não funcionaria por si só, mas aí está.

Ambrown
fonte
0

Eu sei que isso vai soar como um policial, mas eu nunca poderia fazer o sed funcionar quando havia aspas simples e duplas na string. Para ajudar iniciantes como eu que estão tendo problemas, uma opção é dividir a corda. Tive que substituir o código em mais de 100 arquivos index.hmtl. As cordas tinham tanto aspas simples e duplas, então eu só dividir a corda e substituiu o primeiro bloco com <!--e o segundo bloco com -->. Isso bagunçou meus arquivos index.html, mas funcionou.

Mcmacerson
fonte
0

Alguns escapes em terminais AppleMacOSX falham, então:

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

PaSe
fonte
0

use um separador de string alternativo como ":" para evitar confusão com barras diferentes

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

ou se você deseja destacar a aspa simples

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

ambos retornam

one's thing
Brainelectronics
fonte