kann keinen Fehler in der Sed-Substitution finden [duplizieren]

0

Diese Frage hat hier bereits eine Antwort:

Ich versuche, Include-Guards in Kopfzeilen durch dieselben Include-Guards zu ersetzen, denen Folgendes vorangestellt ist #pragma once:

#ifndef _HELLO_H
#define _HELLO_H

Wird:

#pragma once
#ifndef _HELLO_H
#define _HELLO_H

Außerdem möchte ich die Zeilenenden unverändert lassen. Wenn es sich um LF handelte, verwenden Sie LF. Wenn es sich um CRLF handelte, verwenden Sie CRLF.

Ich habe mir folgenden Befehl ausgedacht:

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'

Aber ich habe nur Zeilenenden in allen Überschriften ersetzt und keine #pragma oncehinzugefügt.

Befehl im MSYS2-Terminal unter Windows ausgeführt.

Denis Golovkin
quelle

Antworten:

0

Grund für ein Problem gefunden - da sed standardmäßig nicht mit mehreren Zeilen übereinstimmt.

Außerdem wurden hier einige Lösungen gefunden: Wie kann ich sed verwenden, um eine mehrzeilige Zeichenfolge zu ersetzen?

Arbeitslösung für meinen Spezialfall (mit Perl statt 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"`
Denis Golovkin
quelle