首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用n个变量的乘积替换幂N的变量

用n个变量的乘积替换幂N的变量
EN

Stack Overflow用户
提问于 2015-06-14 01:34:33
回答 2查看 130关注 0票数 1

sed replace a variable of power by the product of two variables,我想把“幂2”情况推广到"N幂情况“。

"power 2“情况下的命令行是:

代码语言:javascript
运行
复制
sed 's/\([^(*+\/^-]*\(([^)]*)\)\?\)\^2/\1\*\1/g'

所以

代码语言:javascript
运行
复制
cos(2*a)^2+sin(3*b)^2+m1^2*m2^2*cos(4*c) 

改为:

代码语言:javascript
运行
复制
cos(2*a)*cos(2*a)+sin(3*b)*sin(3*b)+m1*m1*m2*m2*cos(4*c) 

现在,我想要改变:

代码语言:javascript
运行
复制
cos(a)^3 +m1^4

代码语言:javascript
运行
复制
cos(a)*cos(a)*cos(a)+m1*m1*m1*m1

有没有一种方法来存储指数"N“,并打印N倍可变功率的with star symbol

应该是这样的(我们将指数存储在模式\2中):

代码语言:javascript
运行
复制
sed 's/\([^(*+\/^-]*\(([^)]*)\)\?\)\^\([0-9]*\)/ 

“打印N次(pattern \2)因子\1

代码语言:javascript
运行
复制
  \1\*\1*\1*\1 /g'

如果somenone有其他工具(其他Linux命令)的解决方案,我将使用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-15 07:23:40

代码语言:javascript
运行
复制
echo "cos(a)^3 +m1^4" | sed '
# encapsulate between +
s/.*/+&+/
:a
# For each power object
/\^/!b end

# isolate power object
h
s#\(.*[-+/*^]\)\([^-+/*^]*\)^\([0-9]\{1,2\}\)\(.*\)#\1\
\2\
\4#

# isolate power value to convert it in useable reproducing factor
x
s//00\3/
s/\(.\)\{0,1\}\(.\)\{0,1\}\(.\)\{0,1\}/\1C\2D\3/
s/0.//g;s/9/18/g;s/8/17/g;s/7/16/g;s/6/15/g;s/5/14/g;s/4/13/g;s/3/12/g;s/2/11/g;s/1/U/g
:cdu
s/1\(1*\)\([^1]\)/\2\1\2/g;t cdu
s/C/DDDDDDDDDD/g;s/D/UUUUUUUUUU/g
# dont replicate power 1
s/U//
# we got the replication number

# replicate
G
:repl
s/^U\(U*\n.*\n\)\(.*\)\(\n\)\(.*\)/\1\2\3*\2\4/;t repl

# reassemble
s/\n//g
b a

:end
# remove extra +
s/.\(.*\)./\1/
'

让我们在这个疯狂的世界里疯狂吧(我不推荐在生产中这样做,尤其是在维护和修改方面)

  • 限制功率:正整数小于999
  • 代码中的一些注释,但并不详尽(有点长)
  • 在GNU上测试,但POSIX兼容
  • 递归过程--几乎任何简单的+-*/^之间的有动力的参数--都应该达到sed本身的极限。
票数 1
EN

Stack Overflow用户

发布于 2015-06-14 04:51:02

代码语言:javascript
运行
复制
#!/usr/bin/awk -f
BEGIN {
  RS = "[ \n+]"
  FS = "^"
  OFS = "*"
}
{
  z = $2
  for (y=2; y<=z; y++)
    $y = $1
  printf "%s%s", $0, RT
}

输入

代码语言:javascript
运行
复制
sin(b)
cos(a)^3 +m1^4
tan(c)

输出

代码语言:javascript
运行
复制
sin(b)
cos(a)*cos(a)*cos(a) +m1*m1*m1*m1
tan(c)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30825196

复制
相关文章

相似问题

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