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:
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 \''
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
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.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á.
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.
Respostas:
sed
Códigos de citação com aspas duplas:Não gosto de escapar de códigos com centenas de barras invertidas - machuca meus olhos. Normalmente eu faço desta forma:
fonte
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'
Existem 3 cordas na expressão sed, que a casca então costura:
sed 's/ones/two'
\'
's/'
Espero que ajude mais alguém!
fonte
sed 's/ones/two''s/' <<< 'ones thing'
Não, isso resultatwos 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:
fonte
$'string'
é específico do Bash, portanto não é portátil para o shell POSIX.bash
específico. Também está disponível emksh
ezsh
, 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.
Também funciona com arquivos.
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.
fonte
Este é tipo de absurdo, mas eu não poderia começar
\'
nosed 's/ones/one\'s/'
ao trabalho. Eu estava procurando isso para fazer um script de shell que será adicionado automaticamenteimport 'hammerjs';
ao meusrc/main.ts
arquivo com o Angular.O que eu comecei a trabalhar foi o seguinte:
Portanto, para o exemplo acima, seria:
Não tenho ideia de por
\'
que não funcionaria por si só, mas aí está.fonte
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.fonte
Alguns escapes em terminais AppleMacOSX falham, então:
sed 's|ones|one'$(echo -e "\x27")'s|1' <<<'ones thing'
fonte
use um separador de string alternativo como ":" para evitar confusão com barras diferentes
ou se você deseja destacar a aspa simples
ambos retornam
fonte