我有數字和減號「[ - ]」,「[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-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來完成嗎?
我會說:
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
sed 's/\(-*\)\(.*\)\(...\)/\10\2.\3/;s/0\([1-9]\)/\1/' YourFile
另一種方式,如果需要刪除0和無背參考
perl -pe 's/(\d{3})\b/.$1/;
s/\B\./0./' file
222<word-boundary> --> .222
<non-word-boundary>.222 --> 0.222
它看起來像是要打印小數點等的前導點。如果您張貼正確的輸入,我們可能會用'printf'的方式來做到這一點。 – fedorqui
發佈一些實際樣本輸入和相關輸出。腳本可以測試的東西。 –