não pode encontrar erro na substituição do sed [duplicado]

0

Estou tentando substituir guardas de inclusão em cabeçalhos com os mesmos guardas de inclusão, prefixados com #pragma once :

#ifndef _HELLO_H
#define _HELLO_H

Torna-se:

#pragma once
#ifndef _HELLO_H
#define _HELLO_H

Além disso, quero deixar os finais de linha como estão. Se era LF, use LF, se fosse CRLF, use CRLF.

Eu criei o seguinte comando:

find . -type f -name "*.h" -print0 | xargs -0 sed -i -E -e 's/#ifndef ([a-zA-Z_][a-zA-Z_0-9]+)(\r?\n)#define /#pragma once#ifndef #define /g'

Mas recebi apenas terminações de linha substituídas em todos os cabeçalhos e não foi adicionado #pragma once .

Comando executado no terminal MSYS2 no Windows.

    
por Denis Golovkin 18.04.2018 / 04:44

1 resposta

0

Encontrou a causa raiz de um problema - é porque o sed não combina várias linhas por padrão.

Além disso, encontrei algumas soluções aqui: Como posso usar sed para substituir uma string de várias linhas?

Solução de trabalho para o meu caso especial (usando perl ao invés de sed):

perl -0777 -piE 's/#ifndef ([a-zA-Z_][a-zA-Z_0-9]+)(\r?\n)#define /#pragma once#ifndef #define /gs' 'find . -type f -name "*.h"'
    
por 18.04.2018 / 05:23