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 %p
mit (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. :)