Eu tenho um projeto do Visual Studio, desenvolvido localmente. Os arquivos de código precisam ser implantados em um servidor remoto. O único problema é que os URLs contêm códigos codificados.
O projeto contém URLs como ? Page = one . Para que o link seja válido no servidor, ele deve ser / page / one .
Decidi substituir todos os URLS nos meus arquivos de código pelo sed antes da implantação, mas estou preso em barras.
Sei que essa 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 precisam ser verificados é ~ 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 do b.txt depois de executar o meu comando sed:
pageone
pagetwo
pagethree
O que eu quero que o b.txt contenha:
/page/one
/page/two
/page/three
Respostas:
A maneira mais fácil seria usar um delimitador diferente nas linhas de pesquisa / substituição, por exemplo:
Você pode usar qualquer caractere como um delimitador que não faça parte de nenhuma das cadeias. Ou você pode escapar com uma barra invertida:
O que substituiria
/
comfoo
. Você deseja usar a barra invertida de escape nos casos em que não sabe quais caracteres podem ocorrer nas cadeias de substituição (se forem variáveis de shell, por exemplo).fonte
sed
o comando regex é colocado entre aspas duplas. Não os usei na minha resposta porque não estava mostrando toda ased
linha de comando, mas apenas ased
cadeia de comando regex como o OP havia feito. Se você o colocar em um arquivo, como o OP fez, não precisará das aspas.sed
comando em um script de shell, podem ser necessárias mais barras invertidas (cada barra invertida precisa ser invertida novamente).O
s
comando pode usar qualquer caractere como delimitador; qualquer caractere que vem depois que os
é usado. Fui criado para usar a#
. Igual a:fonte
Um fato muito útil, mas menos conhecido, sobre o sed é que o
s/foo/bar/
comando familiar pode usar qualquer pontuação, não apenas barras. Uma alternativa comum és@foo@bar@
, a partir da qual se torna óbvio como resolver seu problema.fonte
adicione \ antes de caracteres especiais:
etc.
fonte
s/foo\/bar/foo_bar/
vai funcionar, mas/foo\/bar/foo_bar/
não vai.Em um sistema que estou desenvolvendo, a string a ser substituída por sed é um texto de entrada de um usuário que é armazenado em uma variável e passado para sed.
Conforme observado anteriormente nesta postagem, se a sequência contida no bloco de comandos sed contiver o delimitador real usado pelo sed -, o sed será encerrado com erro de sintaxe. Considere o seguinte exemplo:
Isso funciona:
Isso quebra:
Substituir o delimitador padrão não é uma solução robusta no meu caso, pois eu não queria limitar o usuário de inserir caracteres específicos usados pelo sed como delimitador (por exemplo, "/").
No entanto, escapar quaisquer ocorrências do delimitador na sequência de entrada resolveria o problema. Considere a solução abaixo de escapar sistematicamente do caractere delimitador na string de entrada antes de analisá-lo por sed. Esse escape pode ser implementado como uma substituição usando o próprio sed, essa substituição é segura mesmo que a cadeia de entrada contenha o delimitador - isso ocorre porque a cadeia de entrada não faz parte do bloco de comando sed:
Eu converti isso para uma função a ser usada por vários scripts:
fonte
VALUE="01\\\/01\\\/2018"
esta linha deve funcionar para seus três exemplos:
-r
economizar alguns escapamentos.teste com seu exemplo (a.txt):
fonte
replace.txt
deveria estarfonte
Ótima resposta do Anonymous. \ resolvi meu problema quando tentei escapar aspas em strings HTML.
Portanto, se você usar o sed para retornar alguns modelos HTML (em um servidor), use barra invertida dupla em vez de simples:
fonte
sed
é o s tream ed itor , em que você pode usar|
(pipe) para enviar fluxos padrão (STDIN e STDOUT especificamente) através desed
e alterá-los por meio de programação em tempo real, tornando-se uma ferramenta útil na filosofia tradição Unix; mas também pode editar arquivos diretamente, usando o-i
parâmetro mencionado abaixo.Considere o seguinte :
s/
é utilizado para s ubstitute a expressão encontradofew
comasd
:/g
significa "global", o que significa fazer isso para toda a linha. Se você deixar de fora/g
(coms/few/asd/
, sempre precisará haver três barras, não importa o quê) efew
aparecer duas vezes na mesma linha, somente a primeirafew
será alterada paraasd
:Isso é útil em algumas circunstâncias, como alterar caracteres especiais no início das linhas (por exemplo, substituir os símbolos maiores que algumas pessoas usam para citar o material anterior nos segmentos de email por uma guia horizontal, deixando uma desigualdade algébrica entre aspas mais adiante. intocado), mas no seu exemplo em que você especifica que em qualquer lugar
few
ocorre, ele deve ser substituído, verifique se possui/g
.As duas opções a seguir (sinalizadores) são combinadas em uma
-ie
:-i
opção é usada para editar i n lugar no arquivohello.txt
.-e
opção indica o e xpression / comando para executar, neste casos/
.Nota: É importante que você use
-i -e
para pesquisar / substituir. Se o fizer-ie
, crie um backup de cada arquivo com a letra 'e' anexada.fonte
Uma alternativa mais simples é usar o AWK, como nesta resposta :
awk '$0="prefix"$0' file > new_file
fonte