2017-07-05 1 views
0

Wie kann ich alle Vorkommen vonwie eine Funktion zu ersetzen, indem es Inhalte

check_free_set_to_null(&pointer) von

if (pointer) 
{ 
    free(pointer) 
    printf(pointer have been freed) 
} 
else 
{ 
    printf(pointer couldnt had been freed) 
    return (1) 
} 

// maybe using some sort of 

{1} = check_free_set_to_null(CONTENT) 

if ({1}) 
{ 
    free({1}) 
    printf({1} have been freed) 
} 
else 
{ 
    printf({1} couldnt had been freed) 
    return (1) 
} 

ersetzen, wie könnte ich das tun? (Beachten Sie, dass es nicht genau das ist, was ersetzt werden muss, es ist nur ein Beispiel) Ich bin nicht auf der Suche nach dem Compiler, um es als Mehrfachzeile zu interpretieren, ich suche nach der Datei zu ändern.

+1

Ich denke, Sie haben diese Frage richtig geschrieben? – dlmeetei

+0

Ja, mit anderen Tags, so kann ich tatsächlich eine Antwort bekommen :) – user6714088

Antwort

2

Im Grunde genau, wie Sie gesagt haben, es sei denn ...

Dies ist eine jener Fragen, bei denen die richtige Antwort ist wahrscheinlich „Hier ist, wie die dumme Sache zu tun BITTE Sie fragen zu tun, aber bitte wirklich sagen, uns, was dein wirkliches Problem ist, das du zu lösen versuchst, weil das mit ziemlicher Sicherheit nicht der richtige Weg ist. "

Zuerst sollte die Suchzeichenfolge sein (das ist für vim, weil ich das Tag vim sehe. Wenn Sie es mit einer anderen Ersatzregex-Sache machen wollen, lassen Sie uns wissen, welche. Perl, php, sed, awk, die bash-Kommandozeile, etwas):

:%s/\bcheck_free_set_to_null\(([^()]+)\)/ replacement text goes here /g 

das vermutet (möglicherweise falsch), dass es nie irgendwelche Klammern innerhalb der Funktion - wenn dies der Fall sein könnte, dann in Sie wagen rekursive regulären Ausdruck Gebiet und in? In diesem Fall machst du auf jeden Fall das Falsche.

Ihr Ersatz-String sollte sein, was auch immer Ihre Methode enthalten wird - in Ihrem Beispiel, würde es sein:

:%s/\bcheck_free_set_to_null(\([^()]+\))/if (\1)\n{\n free(\1)\n printf("freed")\n}\nelse\n{\n printf("could not free")\n return (\1)\n}/g 

Hier wir \ n für Zeilenende verwenden, weil Sie vi verwenden, so Sie sind wahrscheinlich auf einer Art Unix, und so haben sie ihre Zeilenenden.

Jetzt gibt es eine Sache, die wir hier verbessern könnten. Vertiefung.

:%s/\(\s+\)\(.*\)\bcheck_free_set_to_null(\([^()]+\))/\1\2if (\3)\n\1{\n\1 free(\3)\n\1 printf("freed")\n\1}\nelse\n{\n\1 printf("could not free")\n\1 return (\3)\n\1}/g 

Hier packe ich den Einzug in \1, alles andere auf der Linie in \2, und die Methodenparameter in \3. Was könnte Sie ein bisschen hübscher machen lassen.

Aber noch einmal: Was auch immer Sie hier versuchen, ist wahrscheinlich die falsche Sache zu tun. Sag uns, was das REALE Problem ist! Mach es nicht so! Dieser Weg ist SCHLECHT! DIESE WEISE HAT WEASELS UND ROACHES IN IT! UND DIE WEASEL WERDEN NICHT AUCH DIE RACHEN FÜR SIE ESSEN!

+0

"Es gibt nie irgendwelche Klammern innerhalb der Funktion", Niemals! Ich muss ein Projekt mit einer Norm programmieren, wo es keine triviale Funktion gibt und wo alles geschrieben werden muss. Also einen Zeiger prüfen, freigeben, aufheben und loggen muss im Code und nicht in einer Funktion geschrieben werden. – user6714088

+0

' ':% s/\ bcheck_free_set_to_null \ (([^()] +) \)/ersatztext geht hier/g' Ist nichts passendes wenn ich es versuchte ... hast du es getestet:? – user6714088

Verwandte Themen