استبدال جميع الأرقام بتنسيق العملة الخاص بها في سطر معين من النص

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

سؤال

أريد أن أكتب برنامج Shell (AWK، Sed جيد أيضًا) ليأخذ سطرًا واحدًا من النص كمدخل.

والتي سوف تنشر سلاسل عددية بشكل تعسفي فيه.على سبيل المثال

"12884 و111933 رقمان و323232 رقم أيضًا"

أريد أن يكون الإخراج

"12,884 و1,11,933 رقمان و2,23,232 رقم أيضًا"

إذا كان هذا PHP، فإن preg_replace_callback البسيط قد يخدم الغرض ولكني أريد أن يكون هذا في Shell.:/

أي مؤشرات ستكون ذات فائدة كبيرة.

هل كانت مفيدة؟

المحلول

وانها ليست من الضروري تقسيم خط باستخدام tr. يمكنك الاستفادة من ميزة كلمة تقسيم باش:

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