2016-10-05 11 views
1

Ich habe eine Binärdatei mit einigen Dateipfaden. Wenn der Pfad mit einer bestimmten Zeichenfolge beginnt, sollte der Rest des Dateipfads [\x20-\x7f]+ maskiert werden, damit die allgemeine Struktur und Größe der Datei erhalten bleibt!Bestimmte Dateipfade in Binärdateien maskieren

So mit einer Liste von Pfaden hierfür ist, zu suchen:

/usr/local/bin/ 
/home/joe/ 

Dann wird ein Auftreten wie dies in den binären Daten:

^@^@^@^@/home/joe/********************^@^@^@^@ 
:

^@^@^@^@/home/joe/documents/hello.docx^@^@^@^@ 

Sollte auf diese geändert wird

Was ist der beste Weg, dies zu tun? Haben sed, perl oder awk einen Weg? Oder muss ich ein C- oder PHP-Programm schreiben, wo ich die Zeichenfolge finde und strlen() Anzahl der Maskenzeichen an ihrer Stelle schreiben?

Antwort

3

perl ist eine gute Wahl für die Arbeit an Binärdaten. Für sed und awk können nur die GNU-Implementierungen im Allgemeinen mit binären Daten fertig werden, die anderen würden auf dem NUL-Byte oder auf langen Sequenzen zwischen zwei Newline-Zeichen oder auf nicht-terminierten Linien ersticken.

perl -pi.back -e 's{(/usr/local/bin|/home/joe)/\K[\x20-\x7f]+}{ 
    $& =~ s/./*/rg}ge' binary-file 

Sie bräuchten nicht zu alt, um eine Version von perl für die /r Flag (gibt das Ergebnis der Substitution, anstatt sie auf die Variable der Anwendung) und \K (Reset den Start des angepassten String).

Standardmäßig arbeitet perl -p immer auf einer Zeile, da das Zeilenvorschubzeichen nicht Teil von [\x20-\x7f] ist, das ist in Ordnung.

+0

Diese Lösung funktionierte direkt aus der Box! Ideal für die Anonymisierung persönlicher Daten in Protokolldateien. (Es gibt eine fehlende '/' hinter 'bin', aber das sind Details!) – forthrin

+0

@forthrin. Danke, ich habe jetzt den Trailing '/' aus der Alternation verschoben, so dass er auf beide Pfade zutrifft. –

0

Hier ist ein paar Perl-Code, der funktioniert, obwohl ich bin mir sicher, dass es optimiert werden kann. Es ist ein Filter, so dass es alle von stdin in $data liest, dann für jede Zeichenfolge im Array @dirs es ersetzt das Muster. Die Ersetzung ist jedoch keine feste Zeichenkette, sondern ein Funktionsaufruf replace($dir,$1), der wegen des Modifikators e zum Ersatzbefehl ausgewertet wird.

Die Funktion hat 2 Argumente, das Verzeichnis und den erfassten Teil des Musters. Sie gibt diese Verkettung nach dem Ersetzen jedes Zeichens in der erfassten Zeichenfolge zurück.