2009-08-27 1 views
1

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

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

«12884 и 111933 два числа и 323232 также ряд»

Я хочу выход быть

«12884 и 1,11,933 два числа и 2,23,232 также ряд "

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

Любые указатели окажут большую помощь.

+0

Для тех, кто может быть незнакомым, позиции запятых в этом вопросе верны в Индии (они не опечатываются). См. Http://en.wikipedia.org/wiki/Thousands_separator#Examples_of_use –

+0

Да, это не опечатки. –

ответ

2

Нет необходимости разделить линию, используя 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 

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

+0

Не знал о функции разделения слов, спасибо за указание на это. +1. Я думаю, вы должны исправить это $ foo var в условии if: P –

+0

oops, fixed –

0
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' ' ' 

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

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

  • кулак я разделить линию на несколько строк, так что я могу цикл и понять, какие строки число, и которые не являются
  • я проверить, если текущая строка является числом
  • если это число я анализирую с использованием Printf
  • , если это не я просто эхо его, в результате чего, как это было
  • закончить цикл и поставить все обратно на одной линии
+0

«Завершите цикл и переложите все на одну строку» Я не думаю, что это было сделано правильно в моем случае. Я получаю '\ n' напечатанный в строке вывод –

+0

Мое решение действительно немного беспорядочно, я использовал его только на одной строке и работал, как ожидалось, @Dennis Williamson's намного яснее. Используйте его –