Padrão Multiline Regex e substituição de substituição

1

Para um processo de migração, eu preciso fazer alguma substituição no meu script bash.

Então, nos meus arquivos .txt, eu tenho essas referências, por exemplo:

{{Info DOC
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
}}

O que preciso fazer é editar todas essas ocorrências com este formato:

=== Info DOC ===
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
  1. {{}} removido.
  2. === === adicionado na primeira linha.

Eu tentei fazer um é construir o regex do sed para fazer uma substituição

sed -i -e 's/{{Info DOC/=== Info DOC ===/g' test_file.txt

Portanto, está funcionando como esperado, mas não pode ser o mesmo para a string "}}", pois corresponderá a mais coisas conforme o esperado.

Estou tentando alcançar algo assim:

find . -name '*.txt' -exec perl -i -pe 's/{{Info DOC\(.*\)}}/=== Info DOC ===\n/g' {} \;

Se você tiver algumas dicas para mim, será ótimo! Obrigado a todos!

Solução final: (obrigado @Sundeep)

find . -name '*.txt' -exec perl -i -0777 -pe 's/\{\{(Info DOC)(.*?)\}\}\n/=== $1 ===$2/sg' {} \;

PS: estou no sistema MacOS e uso o bash v4

    
por Sébastien Robert 05.04.2018 / 11:40

1 resposta

0

Tente estes:

$ # tested on GNU-sed, not sure of syntax for other versions
$ sed '/{{Info DOC/,/}}/ { s/{{\(Info DOC\)/===  ===/; /}}/d }' ip.txt
=== Info DOC ===
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
  • /{{Info DOC/,/}}/ da linha que contém {{Info DOC para a linha que contém }} (consulte Endereços de intervalo para detalhes)
    • s/{{\(Info DOC\)/=== ===/ transformar conforme necessário
    • /}}/d exclua este
    • o resto das linhas não será alterado


Com perl

$ perl -0777 -pe 's/\{\{(Info DOC)(.*?)\}\}\n/=== $1 ===$2/sg' ip.txt
=== Info DOC ===
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
  • -0777 slurp arquivo inteiro, então esta solução não é adequada para um arquivo de entrada muito grande
  • .*? correspondência não-voraz
  • s modificador para permitir que . corresponda também ao caractere de nova linha
por 05.04.2018 / 13:38