не могу найти ошибку в замене sed

311
Denis Golovkin

Я пытаюсь заменить включение охранников в заголовках тем же включением охранников с добавлением #pragma once:

#ifndef _HELLO_H #define _HELLO_H 

становится:

#pragma once #ifndef _HELLO_H #define _HELLO_H 

Кроме того, я хочу оставить окончания строк как есть. Если это был LF, тогда используйте LF, если это был CRLF, тогда используйте CRLF.

Я придумал следующую команду:

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 \1/#pragma once\2#ifndef \1\2#define \1/g' 

Но я получил только замену концов строк во всех заголовках, и не #pragma onceдобавил.

Команда выполняется в терминале MSYS2 под Windows.

0

1 ответ на вопрос

0
Denis Golovkin

Нашел основную причину проблемы - это потому, что sed не соответствует нескольким строкам по умолчанию.

Кроме того, нашел несколько решений здесь: Как я могу использовать sed, чтобы заменить многострочную строку?

Рабочее решение для моего особого случая (с использованием perl вместо sed):

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