Como substituir este valor no bash / sed

2

No meu arquivo contém o seguinte texto

http://mydomain.com/test.phtml
http://mydomain.com/classes/main.class.phtml
http://mydomain.com/scripts/filemanager/nl.phtml

eu preciso disso (acho que preciso usar sed?)

http://mydomain.com/mydirectory/test.php
http://mydomain.com/classes/mydirectory/main.class.php
http://mydomain.com/scripts/filemanager/mydirectory/nl.php
    
por Serg 30.11.2014 / 18:52

2 respostas

6
sed 's/\([^/]*\)\.phtml$/mydirectory\/.php/' <filename>

Vai fazer isso, se é isso que você precisa. (opcionalmente com o sinalizador -i para fazer uma substituição no local).

Para terminar, primeiro temos

s/<regexp>/<replacement>/

Que substituirá o que <regexp> corresponde a <replacement> . Em seguida, vamos ver o regexp que tivemos:

\([^/]*\)\.phtml$

Primeiro, no final, temos \.phtml$ , que procurará a string .phtml no final da linha. $ ancora o regexp ao final da linha, e há uma barra invertida na frente do ponto para escapar, porque normalmente um ponto corresponde a qualquer coisa.

Depois disso, o que nos resta é:

\([^/]*\)

Olhando no meio, temos [^/] , que irá corresponder a um caractere ( [] irá corresponder a um dos caracteres dentro dos colchetes), que pode ser qualquer coisa que não seja uma barra, porque ^ fará uma correspondência negada, então ^/ dentro de colchetes "nada além de uma barra". Após o colchete de fechamento, há um asterisco, * , o que significa que ele corresponderá a um ou mais caracteres dentro dos colchetes.

Em seguida, em torno do acima, temos \( e \) , que capturarão o que é correspondido dentro dos parênteses e permitem usá-los na seção <replacement> de s/<regexp>/<replacement>/ , para que possamos usá-los.

E, na seção <replacement> , temos:

mydirectory\/.php/

Que substituirá o rexecp correspondente pelo primeiro mydirectory/ , a barra que precisa ser substituída, pois / é usado como separador para o sed replace e, em seguida, é usado para inserir o texto que foi capturado no primeiro grupo de captura e, em seguida, adicionamos a extensão .php no final.

Tudo isso em conjunto significa que capturaremos tudo, desde o último / até .phtml , adicionar mydirectory/ após a última barra, escreveremos o texto capturado e adicionaremos a extensão .php .

    
por 30.11.2014 / 19:11
0
moi@laptop:/home/moi/tmp >cat in.txt
http://mydomain.com/test.phtml
http://mydomain.com/classes/main.class.phtml
http://mydomain.com/scripts/filemanager/nl.phtml
moi@laptop:/home/moi/tmp >sed -i 's/\/\([^\/]\+\)\.phtml/\/mydirectory\/.php/g' in.txt 
moi@laptop:/home/moi/tmp >cat in.txt
http://mydomain.com/mydirectory/test.php
http://mydomain.com/classes/mydirectory/main.class.php
http://mydomain.com/scripts/filemanager/mydirectory/nl.php
moi@laptop:/home/moi/tmp >
    
por 30.11.2014 / 19:18