2016-10-05 70 views
1

我有一個包含一些文件路徑的二進制文件。如果路徑以某個字符串開頭,則文件路徑[\x20-\x7f]+的其餘部分應該被屏蔽,從而保持文件的一般結構和大小不變!掩蓋二進制文件中的某些文件路徑

與路徑搜索列表

所以是這樣的:

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

然後在二進制數據是這樣發生:

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

應改爲這樣:

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

這樣做的最佳方法是什麼?做sed,perl或awk有辦法嗎?或者我必須編寫一個C或PHP程序,並在其中找到字符串,並在其位置寫入數字掩碼字符strlen()

回答

3

perl是處理二進制數據的好選擇。對於sedawk,只有GNU的實現通常可以處理二進制數據,其他的會扼殺NUL字節或兩個換行符之間的長序列或非終止線。

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

你會需要不是太舊一對/r標誌版本的perl(返回,而不是將它的變量替換的結果)和\K(復位匹配字符串的開始)。

默認情況下,perl -p一次只能處理一行,因爲換行符不是[\x20-\x7f]的一部分,這很好。

+0

該解決方案可以直接使用!非常適合在日誌文件中匿名個人信息。 (在'bin'後面有一個'/',但這是細節!) – forthrin

+0

@forthrin。謝謝,我現在已經把尾部的'/'移出了交替,所以它適用於兩個路徑。 –

0

這是一些可以工作的perl代碼,但我確信它可以被優化。它是一個過濾器,所以它將所有stdin讀入$data,然後對於數組@dirs中的每個字符串,它會替換該模式。然而,替換不是一個固定的字符串,而是一個函數調用replace($dir,$1),由於替換命令的修改符e被評估。

#!/usr/bin/perl 
use strict; 
sub replace{ 
    my ($dir,$rest) = @_; 
    $rest =~ s/./*/g; 
    return $dir.$rest; 
} 
my @dirs = ('/usr/local/bin/','/home/joe/'); 
my $data = join("",<STDIN>); 
foreach my $dir (@dirs){ 
    $data =~ s|$dir([\x20-\x7f]+)|replace($dir,$1)|ge; 
} 
print $data; 

該函數給出2個參數,模式的目錄和捕獲部分。它在替換捕獲的字符串中的每個字符後返回這些連接。

相關問題