Ich kann keinen Fehler in der Sed-Substitution finden

375
Denis Golovkin

Ich versuche, Include-Wachen in Kopfzeilen zu ersetzen, wobei Wächter wie folgt vorkommen #pragma once:

#ifndef _HELLO_H #define _HELLO_H 

Wird:

#pragma once #ifndef _HELLO_H #define _HELLO_H 

Ich möchte auch die Zeilenenden so lassen, wie sie sind. Wenn es LF war, dann LF verwenden, wenn es CRLF war, dann CRLF verwenden.

Ich kam mit folgendem Befehl:

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 Kopfzeilen ersetzt und keine weiteren #pragma oncehinzugefügt.

Befehl innerhalb des MSYS2-Terminals unter Windows ausgeführt.

0

1 Antwort auf die Frage

0
Denis Golovkin

Die Hauptursache für ein Problem gefunden - Grund dafür ist, dass sed standardmäßig nicht mit mehreren Zeilen übereinstimmt.

Hier finden Sie auch einige Lösungen: Wie kann ich sed verwenden, um eine mehrzeilige Zeichenfolge zu ersetzen?

Arbeitslösung für meinen speziellen Fall (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"`