sed - 用N个变量

时间:2015-06-14 01:34:33

标签: regex bash sed

来自sed replace a variable of power by the product of two variables,我想概括一下" power 2"案例到" N电源案例"。

" power 2"中的命令行案例是:

sed 's/\([^(*+\/^-]*\(([^)]*)\)\?\)\^2/\1\*\1/g'

那样

cos(2*a)^2+sin(3*b)^2+m1^2*m2^2*cos(4*c) 

替换为:

cos(2*a)*cos(2*a)+sin(3*b)*sin(3*b)+m1*m1*m2*m2*cos(4*c) 

现在,我想改造:

cos(a)^3 +m1^4

cos(a)*cos(a)*cos(a)+m1*m1*m1*m1

有没有办法存储指数" N"并打印N次变量驱动with star symbol

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

sed 's/\([^(*+\/^-]*\(([^)]*)\)\?\)\^\([0-9]*\)/ 

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

  \1\*\1*\1*\1 /g'

如果某人没有其他工具(其他Linux命令)的解决方案,我会接受。

2 个答案:

答案 0 :(得分:3)

sin(b)
cos(a)^3 +m1^4
tan(c)

输入

sin(b)
cos(a)*cos(a)*cos(a) +m1*m1*m1*m1
tan(c)

输出

 B(): b(9), A(foo()) { } 

答案 1 :(得分:1)

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 sed测试,但符合POSIX标准
  • 递归过程所以+-*/^之间几乎所有简单的有力参数都应该达到sed本身的极限。