Замена всех чисел их форматом валюты в данной строке текста - PullRequest
1 голос
/ 27 августа 2009

Я хочу написать программу Shell (AWK, Sed также отлично), которая будет принимать в качестве входных данных одну строку текста.

Который будет произвольно растягивать целочисленные строки в нем. * например 1003 *

"12884 и 111933 - это два числа, а 323232 - это тоже число"

Я хочу, чтобы вывод был

"12,884 и 1,11,933 - это два числа, а 2,23,232 - это тоже число"

Если бы это был PHP, простой preg_replace_callback служил бы цели, но я хочу, чтобы это было в оболочке. : /

Любые указатели очень помогли бы.

Ответы [ 2 ]

2 голосов
/ 27 августа 2009

Нет необходимости разбивать строку, используя tr. Вы можете использовать функцию разделения слов в Bash:

line="12884 and 111933 are two numbers and 323232 is also a number"
for word in $line
do
    if [[ $word = *[^0-9]* ]]
    then
        printf "%s " $word
    else
        printf "%'d " $word
    fi
done

Я также использовал globbing для проверки последовательности цифр вместо того, чтобы полагаться на что-то, что создает ошибку или нет, в зависимости от того, является ли это целым числом.

0 голосов
/ 27 августа 2009
for line in $(echo "12884 and 111933 are two numbers and 323232 is also a number" 
    | tr ' ' '\n');
    do 
        if [ $line -eq $line 2> /dev/null ]; 
            then printf "%'d\n" $line;
        else 
            echo $line; 
        fi; 
    done | tr '\n' ' '

Я понимаю, что это может быть долго и безобразно, но сейчас это лучшее, что я мог сделать, я надеюсь, что это поможет.

Следует объяснению:

  • fist Я разделил строку на несколько строк, чтобы я мог зациклить и распознать, какие строки являются числовыми, а какие нет
  • тогда я проверяю, является ли текущая строка числом
  • если это число, которое я анализирую с использованием printf
  • если это не так, я просто повторяю это, оставляя, как это было
  • закончить цикл и положить все обратно на одну строку
...