2010-04-24 3 views

ответ

4

Bash

#!/bin/bash 
shopt -s extglob 
while read -r line 
do 
    set -- $line 
    for((i=1;i<=${#};i++)) 
    do 
    s=$(eval echo \${${i}}) 
    case "$s" in 
    +([0-9]).+([0-9])) s=$(printf "%.2f " $s);; 
    esac 
    printf "%s " $s 
    done 
    echo 
done <"file" 

выходные

$ cat file 
bla1 bla 2 bla 3.4689 bla bla bla 4.39223 bla. 
words ..... 2.14 blah blah 4.5667 blah 

$ ./shell.sh 
bla1 bla 2 bla 3.47 bla bla bla 4.39 bla. 
words ..... 2.14 blah blah 4.57 blah 
+0

Вы, случайно, Стив Борн :) Вы выглядите как супер-гуру оболочки .. ++ btw :) – gameover

0

awk BEGIN{RS="[[:space:]]"} /[0-9].[0-9]/{printf("%.2f%s",$1,RT)} !/[0-9].[0-9]/{printf("%s%s",$1,RT)} f.txt

Вы можете захотеть изменить RS на то, что может обрабатывать более широкий набор границ слов. Преимущество этого решения состоит в сохранении границы, а не просто перепечатке вывода, разделенного пробелами.

Смежные вопросы