2015-04-17 45 views
-1

我有數字和減號「[ - ]」,「[0-9]」的可變數據。它可能是:用模式X.XXX修改數字

source NUMBER ->result NUMBER AFTER MODIFY 
XXX ->0.XXX, 
XXXX ->X.XXX, 
XXXXX ->XX.XXX, 
-XXX -> -0.XXX, 
-XXXX ->-X.XXX, 
-XXXXX ->-XX.XXX, 

這可以用sed來完成嗎?

+0

它看起來像是要打印小數點等的前導點。如果您張貼正確的輸入,我們可能會用'printf'的方式來做到這一點。 – fedorqui

+0

發佈一些實際樣本輸入和相關輸出。腳本可以測試的東西。 –

回答

3

我會說:

sed -r 's/[0-9]{3}$/.&/; s/^(-?)\./\10./' filename 

即:

s/[0-9]{3}$/.&/ # put a dot before the last three digits in a line 
s/^(-?)\./\10./ # if the result of this begins with . or -., insert a 0 
        # before the . 

-r需要GNU sed的。如果你在BSD或Mac OS X,它附帶了BSD sed的,你可以使用

sed 's/[0-9]\{3\}$/.&/;s/^\(-\?\)\./\10./' filename 

這是同樣的事情,而不是基本的擴展正則表達式語法。

附錄:細想起來,這似乎是等同於

awk '{ printf("%.3f\n", $0/1000) }' filename 
+0

'awk'{printf(.../1000)...''很酷! +1 – JJoao

+0

加1爲awk答案。 –

+0

awk - 最棒的!謝謝! – Major

0
sed 's/\(-*\)\(.*\)\(...\)/\10\2.\3/;s/0\([1-9]\)/\1/' YourFile 

另一種方式,如果需要刪除0和無背參考

0
perl -pe 's/(\d{3})\b/.$1/;   
      s/\B\./0./' file  
  • line1:222<word-boundary> --> .222
  • line2:<non-word-boundary>.222 --> 0.222