with - slash in sed




Como substituir strings contendo barras com sed? (7)

Eu tenho um projeto do Visual Studio, que é desenvolvido localmente. Os arquivos de código precisam ser implantados em um servidor remoto. O único problema é conter os URLsthey que estão codificados.

O projeto contém URLs como "página = um" . Para o link ser válido no servidor, ele deve ser / page / one .

Decidi substituir todas as URLs nos meus codefiles por sed antes da implantação, mas estou preso em barras.

Eu sei que esta não é uma solução bonita, mas é simples que me pouparia muito tempo. O número total de strings que tenho que substituir é menor que 10. O número total de arquivos que devem ser verificados é de ~ 30.

Exemplo descrevendo minha situação está abaixo:

Comando que estou usando:

sed -f replace.txt < a.txt > b.txt

replace.txt que contém todas as strings:

s/?page=one&/pageone/g
s/?page=two&/pagetwo/g
s/?page=three&/pagethree/g

a.txt:

?page=one&
?page=two&
?page=three&

Conteúdo de b.txt depois de executar meu comando sed:

pageone
pagetwo
pagethree

O que eu quero b.txt para conter:

/page/one
/page/two
/page/three

Ótima resposta do Anonymous. \ resolvi meu problema quando tentei escapar de citações em strings HTML.

Portanto, se você usar sed para retornar alguns modelos HTML (em um servidor), use barras invertidas duplas em vez de simples:

var htmlTemplate = "<div style=\\"color:green;\\"></div>";

A maneira mais fácil seria usar um delimitador diferente em suas linhas de pesquisa / substituição, por exemplo:

s:?page=one&:pageone:g

Você pode usar qualquer caractere como um delimitador que não faz parte de nenhuma das cadeias. Ou você pode escapar com uma barra invertida.


O comando s pode usar qualquer caractere como um delimitador; qualquer caractere vem depois que o s é usado. Eu fui criado para usar um # . Igual a:

s#?page=one&#/page/one#g

Um fato muito útil mas pouco conhecido sobre o sed é que o familiar comando s/foo/bar/ pode usar qualquer pontuação, não apenas barras. Uma alternativa comum é [email protected]@[email protected] , a partir da qual se torna óbvio como resolver seu problema.


adicione \ antes de caracteres especiais:

s/\?page=one&/page\/one\//g

etc.


esta linha deve funcionar para seus 3 exemplos:

sed -r 's#\?(page)=([^&]*)&#/\1/\2#g' a.txt
  • Eu usei -r para salvar alguns escapando.
  • a linha deve ser genérica para o seu, dois, três casos. você não precisa fazer o sub 3 vezes

teste com o seu exemplo (a.txt):

kent$  echo "?page=one&
?page=two&
?page=three&"|sed -r 's#\?(page)=([^&]*)&#/\1/\2#g'
/page/one
/page/two
/page/three

sed é o s tream ed itor , em que você pode usar | (pipe) para enviar streams padrão (STDIN e STDOUT especificamente) através do sed e alterá-los programaticamente rapidamente, tornando-se uma ferramenta útil na tradição da filosofia Unix; mas também pode editar arquivos diretamente, usando o parâmetro -i mencionado abaixo.
Considere o seguinte :

sed -i -e 's/few/asd/g' hello.txt

s/ é usado para substituir a expressão encontrada few por asd :

Os poucos, os bravos.

O asd, o valente.

/g significa "global", significando fazer isso para toda a linha. Se você deixar o /g (com s/few/asd/ , sempre precisa haver três barras, não importa o que) e few aparecem duas vezes na mesma linha, apenas as primeiras são alteradas para asd :

Os poucos homens, as poucas mulheres, os bravos.

Os homens do asd, as poucas mulheres, os bravos.

Isso é útil em algumas circunstâncias, como alterar caracteres especiais no início das linhas (por exemplo, substituir os símbolos de maior que algumas pessoas usam para citar o material anterior em encadeamentos de e-mail com uma guia horizontal, deixando uma inequação algébrica mais tarde na linha intocado), mas no seu exemplo, onde você especifica que qualquer lugar que ocorra, deve ser substituído, certifique-se de que você tem /g .

As duas opções a seguir (sinalizadores) são combinadas em uma, -ie :

-i opção é usada para editar no lugar no arquivo hello.txt .

-e opção -e indica o comando e xpression / a executar, neste caso s/ .

Nota: É importante que você use -i -e para procurar / substituir. Se você fizer isso, crie um backup de todos os arquivos com a letra 'e' anexada.