tr 中的脚本变量

script variable in tr

我想制作一个寻找特殊数字的脚本。

这样的数字 153 = 1^3+5^3+3^3

bash 脚本 153 3

153

在我的脚本中有这样的东西

echo "" | tr -d " " | sed -e 's/\([[:digit:]]\)/+/g' | tr '+' '^""+'

最后一个命令不起作用,它确实改变了一些东西,它将 1+5+3+ 更改为 1^+5^+3^+

所以我的问题是:如何在 tr 中使用变量?

tr 将一个字符替换为另一个字符。它不能用更长的字符串替换一个字符。那是 sed 的工作:

set -- 153 3
echo "" | \
    tr -d " " | \
    sed -e 's/\([[:digit:]]\)/^'""'+/g; s/\+$//'

choroba 的回答是正确的。这是一个基于 python 的单行代码:

$ set -- 153 3
$ python -c "print '+'.join([x+'^' for x in list('')])"
1^3+5^3+3^3

解释:

  1. list 会将字符串 "153" 转换为 ['1', '5', '3']
  2. [ x+'^$2' for x in ] 称为列表理解。实际上它 returns 另一个列表:['1^3', '5^3', '3^3']
  3. 然后加入他们'+'

注意:我添加此答案的唯一原因是,这不需要在通过内置函数处理后调整完整的字符串。

以下是其他常见方法:

$ python -c "print '^+'.join(list('')) + '^'" # Add "^3" after join returns "1^3+5^3+3"
$ echo  | sed "s/./&^+/g; s/+$//" # Remove last '+' sign from "1^3+5^3+3^3+"