2012-10-04 57 views
1

我上一個項目,需要一個分隔設置表單數據的工作:在分隔文本文件更換空字段與虛擬值

field1~field2~field3~.....~fieldn 

有空字段是一種可能性,所以

field1~~~field4~~field6 

是完全可以接受的。

該文件被翻譯使用內部翻譯程序,留下一點點不理想。具體來說,它不能很好地處理空的域。我的解決方案是在那裏粘貼一些虛擬值,比如空格或@符號。我已經試過:

sed -r 's/~/~ ~/g' 

awk '{gsub(/\~\~/,"~ ~")}; 1' file > file.SPACE 

但在更換多個領域這兩個秋天短。所以,如果我輸入

field1~field2~~~field3 

它會輸出:

field1~field2~ ~~field3 

我想只是劇本,如果我可以,因爲我無法改變譯者的代碼。我可以更改創建分隔文件的程序中的代碼,但我寧願不要。是否有一些解決方法,或者正在爲此提供一個表達式,這只是常規語言中固有限制之一?

編輯:哇感謝大家的快速反應,所有的解決方案工作,所以我upvoted所有的人。由於解釋,我想我會接受Janito的。

爲什麼downvote?

回答

4

你可以嘗試:

sed -e ':a;s/~~/~ ~/;ta' 

這將創建一個標籤「一」與「:」命令,然後替換的~~一個occurrance與~ ~,然後使用「T」測試命令跳回如果前一個替代命令成功,則轉到「a」標籤。

希望這有助於=)

3
awk '{for(i=0; i<=NF; i++) if($i ~ /^$/) $i = " " } 1' FS='~' OFS='~' input 

或:

awk '/^$/{ $0 = " " } 1' ORS='~' RS='~' input 

或:

awk '{ while(gsub("~~", "~ ~")); }1' input 
1
sed -e ':loop' -e 's/~~/~ ~/g' -e 't loop' file 
1

您可以使用Perl

perl -pe 's/~(?=~)/~ /g' 

...其中說,與"~ "


爲了存儲結果(一個或多個),以file.SPACE使用替換每個隨後"~""~"

perl -pe 's/~(?=~)/~ /g' file >file.SPACE