2009-08-27 5 views
1

쉘 (AWK, Sed도 괜찮음) 프로그램을 작성하여 한 줄의 텍스트를 입력하고자합니다.주어진 텍스트 줄에서 모든 숫자를 통화 형식으로 바꿉니다.

임의로 확장 된 정수 문자열이 포함됩니다. 숫자는 예를 들어

I 출력이

"12884과 1,11,933 두 개의 숫자와 2,23,232 있습니다되고 싶어

"12,884과 111,933 두 개의 번호 323232입니다 또한 숫자입니다 "입니다 "

PHP의 경우 간단한 preg_replace_callback이이 용도로 사용되었지만 쉘에 있어야합니다. :/

모든 포인터가 도움이 될 것입니다.

+0

생소 할 수도있는 사람들을 위해 인도에서는 쉼표의 위치가 정확합니다 (오타가 아닙니다). http://en.wikipedia.org/wiki/Thousands_separator#Examples_of_use를 참조하십시오. –

+0

예, 오타가 아닙니다. –

답변

2

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 

: 당신은 배쉬의 말씀 분할 기능을 사용 할 수 있습니다.

+0

단어 분리 기능을 알지 못했습니다. 지적 해 주셔서 고맙습니다. +1. if 시험 조건에서 $ foo var을 수정해야한다고 생각합니다. 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은 훨씬 더 명확합니다. 그의 것을 사용하십시오 –