首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed似乎没有始终如一的替代-失败的*

sed似乎没有始终如一的替代-失败的*
EN

Unix & Linux用户
提问于 2020-12-18 10:14:24
回答 1查看 53关注 0票数 1

我试图编写一个循环,按照操作的顺序(而不是通常的数学优先级)计算操作,代码如下(echo用于调试):

代码语言:javascript
复制
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“传递时,输出如下:

代码语言:javascript
复制
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解释了*,这可能会阻止所需的颠覆。

知道如何绕过这种行为吗?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-12-18 14:07:57

一种只使用bash而不需要外部命令的解决方案

代码语言:javascript
复制
#!/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"

如果要使用浮动算术,则需要使用bcdc。这个变体使用dc,作为在评论中建议

代码语言:javascript
复制
#!/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
票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/625077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档