문제

나는 한 줄의 텍스트 라인을 입력하기 위해 쉘 (AWK, SED Fine) 프로그램을 작성하고 싶습니다.

정수 줄을 임의로 퍼뜨릴 것입니다. 예를 들어

"12884와 111933은 두 숫자이고 323232도 숫자입니다."

나는 출력이되기를 원한다

"12,884 및 1,11,933은 2 숫자이고 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