Я пытаюсь заменить включение заголовков в заголовках тем же включением, предварительно добавленным #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.

1 ответ1

0

Нашел основную причину проблемы - это потому, что 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"`

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .