Como escapar de uma aspa simples em uma expressão sed que já está entre aspas?
Por exemplo:
sed 's/ones/one's/' <<< 'ones thing'
Como escapar de uma aspa simples em uma expressão sed que já está entre aspas?
Por exemplo:
sed 's/ones/one's/' <<< 'ones thing'
Respostas:
sed
Có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
sed -i
, algum motivo particular?
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!
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.
A melhor maneira é usar $'some string with \' quotes \''
por exemplo:
sed $'s/ones/two\'s/' <<< 'ones thing'
$'string'
é específico do Bash, portanto não é portátil para o shell POSIX.
bash
específico. Também está disponível em ksh
e 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.
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
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.ts
arquivo 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á.
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.
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