Ersetzen Sie %p durch %pK im Linux-Kernelcode

Ersetzen Sie %p durch %pK im Linux-Kernelcode

Ich warte einen Linux-Treiber und möchte alle %p im Treiber durch %pK ersetzen. Dazu habe ich den folgenden Befehl verwendet.

grep "%p[^K]" -Rl . | xargs sed -i 's/%p[^K]/%pK/g'

Im folgenden Fall schlägt es fehl.

%p-%p --> %pK%pK (hyphen is removed)

Bitte schlagen Sie einen geeigneten regulären Ausdruck vor, damit der Sed-Befehl funktioniert.

Antwort1

Der sed-Ersatz in der Frage würde alle Zeichen nach einem entfernen %p, nicht nur Bindestriche, da das [^K]Teil der übereinstimmenden Zeichenfolge ist. Sie können das umgehen, indem Sie das Zeichen danach %pmit (escaped) Klammern erfassen und mit wieder einfügen \1. In sed:

$ echo '%p %p %pK' | sed 's/%p\([^K]\)/%pK\1/g'
%pK %pK %pK

Sie möchten jedoch möglicherweise oder Ähnliches verwenden, [^a-zA-Z]nur für den Fall, dass Sie andere Modifikatoren für verwenden möchten %p.

Antwort2

Der folgende Befehl hat bei mir Wunder gewirkt

for fname in $(grep "%p[^K]" -Rl .); do perl -pi -e 's/%p(?!K)/%pK/g' $fname; done

Danke, Sundeep, dein Kommentar hat mir sehr geholfen. :)

verwandte Informationen