2015-01-05 3 views
1

Я хочу создать скрипт, который ищет специальные числа.script variable in tr

числа, как это 153 = 1^3 + 5^3 + 3^3

Баш скрипт 153 3

В моем сценарии у меня есть это любопытное дело

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

Эта последняя команда не работает, она что-то меняет, она меняет 1+5+3+ до 1^+5^+3^+

Так что мой вопрос: как я могу использовать переменные в tr?

+0

Я думаю, что 'sed' бы здесь более уместна ... – ciuak

+0

Ваша первая задача состоит в том, чтобы записать то, что именно вы хотите достичь. Забудьте bash, забудьте о том, что компьютеры используют электроны. Определите, какой вход должен содержать результат. Определите это очень ясно. Тогда выяснится, что большая часть вашей работы выполнена. –

ответ

1

tr заменяет один символ другим. Он не может заменить один символ более длинной строкой. Это sed «S работа:

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

Ответ на choroba правильно. Вот на основе питона один вкладыш:

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

Объяснение:

  1. список будет преобразовать строку "153" в ['1', '5', '3']
  2. [х +^$ 2 'для й в < списке >] называется список понимание. Эффективно возвращает другой список: ['1^3', '5^3', '3^3']
  3. Затем соединить их с '+'

ПРИМЕЧАНИЕ: Только поэтому я добавил этот ответ был, потому что это не требует, чтобы настроить законченную строку после обработки наплавленных функций.

Ниже приведены другие общие подходы:

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