sed가 지속적으로 교체되지 않는 것 같습니다. - * 실패

sed가 지속적으로 교체되지 않는 것 같습니다. - * 실패

(일반적인 수학적 우선 순위 대신) 나타나는 순서대로 작업을 계산하는 루프를 작성하려고 합니다. 코드는 다음과 같습니다(echo는 디버깅용입니다).

while [[ "$(echo "$newstring"| grep -E ^-?[0-9]+$)" = "" ]]; do
       oldpart="$(echo "$newstring"|cut -f1-3 -d' ')"
       echo "bla $oldpart"
       newpart="$(echo "$oldpart"|bc)"
       echo "ble $newpart"
       newstring="$(echo "$newstring"|sed -e "s/$oldpart/$newpart/")"
       echo "bli $newstring"
done

$newstring이 "6 + 6 * 9"로 전달되면 출력은 다음과 같습니다.

6 + 6 * 9
bla 6 + 6
ble 12
bli 12 * 9
bla 12 * 9
ble 108
bli 12 * 9
bla 12 * 9
ble 108

6 + 6이 예상대로 12로 평가된 다음 문자열로 대체되는 것을 볼 수 있습니다. 그런 다음 작업은 12 * 9, 108에서 다시 시작됩니다. 문자열로 바꿀 수 없으며... 동안은 끝나지 않습니다.

나는 sed가 * 이것을 원하는 대체를 방해하는 것으로 해석한다고 생각합니다.

이 동작을 우회하는 방법을 아시나요?

답변1

bash외부 명령 없이 작동하는 솔루션

#!/bin/bash
newstring='6 + 6 * 9'

read -a atoms <<<"$newstring"
run=${atoms[0]}               # Initialise running total to the first value

for ((i=1; i<=${#atoms[@]}; i+=2))
do
    op=${atoms[$i]}           # Next operator
    num=${atoms[$((i+1))]}    # Next number
    run=$((run $op num))      # Perform the arithmetic (integer maths)
done
echo "$run"

부동 소수점 연산을 사용하려면 bc또는 를 사용해야 합니다 dc. 이 변형은 dc다음과 같이 를 사용합니다.댓글로 추천해주세요

#!/bin/bash
newstring='6.5 + 6 * 9'

{
    read -a atoms <<<"$newstring"

    run=${atoms[0]}
    printf "%s " "$run"

    for ((i=1; i<=${#atoms[@]}; i+=2))
    do
        op=${atoms[$i]} num=${atoms[$((i+1))]}
        printf " %s %s" "$num" "$op"
    done
    printf " p\n"
} | dc

관련 정보