Я пытаюсь выполнить математическую операцию sed
, но она продолжает обрабатывать мои переменные как строки. Вход такого типа:
$ echo 12 | sed 's/[0-9]*/&+3/'
$ 12+3
Я хотел бы иметь 15 в качестве вывода. Мне нужно выполнить операцию и заменить ее математический результат всего за один проход, потому что я запускаю программу как демон Python и хочу избежать отрывков, таких как перенаправление stdout
файлов, открытие этих файлов, выполнение операций, извлечение результата, выполнение замена. Мне sed
кажется, лучше всего выполнять все в одной строке.
Я пытался привести оба ввода и вывода различными способами, такими как
$ echo 12 | sed 's/[0-9]*/int(&+3)/'
$ echo 12 | sed 's/[0-9]*/\int(&+3)/'
$ echo 12 | sed 's/[0-9]*/\int(&+3)/'
но результатом всегда была печать второго поля.
sed
математикуОтветы:
Если вы честно хотите использовать sed, то это путь:
Входные данные:
Выход:
Ваша миссия, если вы решите принять это, заключается в реализации умножения.
источник
sed
здесь не лучший вариант, он не выполняет арифметику изначально (см. Увеличение числа, чтобы узнать, как вы могли бы это сделать, хотя). Вы можете сделать это сawk
:Лучший код для использования будет зависеть от точного формата ввода и того, что вы хотите / нужно сделать, если он не числовой или содержит более одного числа и т. Д.
Вы также можете сделать это только с
bash
:или используя
expr
аналогичным образом.источник
Я пытался принять ваш вызов @Richter, вот что я сделал, используя часть вашего кода:
Входные данные:
Вывод: все правильные результаты
источник
perl
допускает очень похожую конструкцию наsed
s ... одно отличие в том, чтоperl
можно делать более сложные вещи ...sed
очень хорошо для простых текстовых подстановоквыход
источник
perl -pe 's/[0-9]+/$&+3/e'
просто подать строку в калькулятор
источник
Я действительно не понимаю, почему чрезвычайная сложность принятого ответа, любой из следующих действий делает то, что вы хотите:
или
Я думаю, что это может потребовать GNU sed, но я не уверен.
источник
echo 12+3 | sed -r 's/([0-9]*) *\+ *([0-9]*)/expr \1 + \2/e'
Если вам определенно необходимо объединить регулярные выражения и арифметические операции, выберите язык, в котором параметр замены регулярного выражения может быть функцией обратного вызова.
Perl, Ruby, JavaScript и Python являются такими языками:
источник
Другое простое
bash
решение, которое на самом деле работает в трубе:источник
Если вы смешаете в некотором башизме:
Чтобы извлечь номер из текста:
Без седа, просто баш
заменяет все нецифровые символы
${var//[^0-9]/}
и выполняет арифметику в двойных круглых скобках:$((x+3))
источник
$((...))
был введен POSIX (bashism есть$[...]
).${var//xxx/x}
это kshism, также скопированный zsh и bash.sed -r
это GNUismВот решение Perl:
Если вы предпочитаете изменить первый набор цифр, встречающихся в строке, вы можете использовать:
Если вы предпочитаете изменить все наборы цифр в строке, вы можете использовать
/g
модификатор, например так:источник
Хотя использование sed-выражения прекрасно, но оно имеет свои ограничения. Например, следующее не удается:
Чтобы преодолеть это ограничение, можно просто обратиться к встроенной мощности чистого sed и реализовать следующий десятичный сумматор произвольной длины:
Это работает путем реализации модуля десятичного сумматора, который добавляет две входные цифры (A и B), а также бит переноса и выдает бит суммы и переноса. Идея заимствована из электронного, где двоичный сумматор делает то же самое для двоичных чисел. Все, что нам нужно сделать, это зациклить сумматор на всех цифрах, и мы можем добавить числа произвольной длины (ограниченные памятью). Ниже сумматор в действии:
Точно так же можно реализовать двоичный (или любой другой базовый) сумматор. Все, что вам нужно сделать, это заменить строку, которая начинается
s/$/;000=00001...
с правильного шаблона замены для данной базы. Например:s/$/;000=00001=01010=01011=10100=01101=10110=10111=11/
шаблон подстановки для двоичного сумматора произвольной длины.Вы можете соответствовать коду, документированному на моем github .
источник