2008-12-19 76 views
1

我有一些數據文件導入到數據庫中的一些「獨特」的分隔符:如何做搜索/替換命令行「二進制」文件

字段分隔符(FS):SOH(ASCII字符1)

記錄分離器(RS):STX(ASCII字符2)+ '\ n'

我想將文件導入到使用COPY命令的Postgres但雖然我可以指定自定義字段分隔符,它不能處理記錄分隔符。

我不能只從數據中去掉\ 002,因爲如果在其中一個字段中有一個換行符(並且有),它會錯誤地將COPY認爲是新的記錄事實並非如此。

需要注意的一件重要的事情是:保留字段中的換行符並不重要,如果它們只是轉換爲空格就沒有問題。考慮到這一點,我正在考慮使用類似「sed」的命令將換行符轉換爲空格,然後將\ 002轉換爲換行符。但是,由於sed是一個基於行的工具,它似乎沒有在每行的末尾看到換行符,並且無法對它們執行搜索/替換。

是否有任何其他的unix命令行工具可以完成這項工作?

編輯:我想我真正要求的是UNIX的實用工具,可以處理文件(執行查找/替換)爲「二進制」,不要把它分爲線

回答

2

基於由Patrick給出的建議,我已經能夠使用Perl做到這一點:

貓文件| perl -pe's/\ 002 \ n/\ 002 \ 002/g'| perl -pe's/\ n// g'| perl -pe's/\ 002 \ 002/\ n/g'

1

你能否通過做多遍文件?通過1將所有\ 002 \ n轉換爲\ 002 \ 002說。 第2遍可以將所有\ n轉換爲空格。通過3可以將\ 002 \ 002全部轉換爲\ n。

+0

多次通過不是問題 - 我可以通過將幾個unix命令一起管道來做到這一點。我看到的問題是,「sed」逐行使用數據,這會有效隱藏替代命令中的最後一個「\ n」 - 它是不可觸摸的。 – 2008-12-19 03:41:31