Procura e substitui vários arquivos, incluindo subdiretórios

0

Eu quero pesquisar todas as ocorrências de:

</form>

No diretório atual e em seus subdiretórios, substitua-o por:

<input type="hidden" name="_token" value="<cfoutput>#STOKEN#</cfoutput>"/>
</form>

Eu tentei o seguinte em um arquivo. O arquivo foi touch ed - a data da última modificação foi alterada, mas a substituição não foi feita:

sed -i -re 's/\<\/form\>/\<input type="hidden" name="_token" value="\<cfoutput\>#STOKEN#\<\/cfoutput\>"\>\<\/form\>/gi' ./math.cfm

O que estou perdendo? Existe um comando melhor para usar para isso?

    
por PeterKA 02.07.2015 / 16:36

1 resposta

2

Os elementos \< e \> têm um significado especial na regex de sed (como limites de palavras).

Não dificulte as coisas usando / como separador do sed e tentando obter o escape certo - escolha um delimitador alternativo que não apareça no seu texto, como % ou | .

O comando i ( insert ) parece-me uma escolha mais natural do que o comando s para esta tarefa: você pode tentar

'\%</form>% i\<input type="hidden" name="_token" value="<cfoutput>#STOKEN#</cfoutput>"/>'

Para aplicar esse comando aos subdiretórios recursivamente, você pode fornecer o comando sed como um argumento -exec ou -execdir para find , por exemplo,

find path/to/dir -type f -name '*.cfm' -execdir sed -i -re '\%</form>% i\<input type="hidden" name="_token" value="<cfoutput>#STOKEN#</cfoutput>"/>' {} +

Como alternativa, você pode usar a funcionalidade globstar do shell.

    
por steeldriver 02.07.2015 / 16:52