Замена всех чисел их валютным форматом в заданной строке текста

StackOverflow https://stackoverflow.com/questions/1341270

Вопрос

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

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

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

Я хочу, чтобы результат был

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

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

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

Это было полезно?

Решение

Нет необходимости разделять строку с помощью 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 для проверки последовательности цифр, вместо того чтобы полагаться на что-то, что создает ошибку или нет, в зависимости от того, является ли это целым числом.

Другие советы

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
  • если это не так, я просто повторяю это, оставляя все как было
  • завершите цикл и верните все на одну линию
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top