Это должно работать (замена _ чем-то еще должна он сталкиваться с Вашими журналами):
sed -e 's/pattern/_&/1' -e 's/\([^_]\)pattern//g' -e 's/_\(pattern\)/\1/'
От bash
страница справочника:
((expression)) The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION. If the value of the expres- sion is non-zero, the return status is 0; otherwise the return status is 1. This is exactly equivalent to let "expression".
И далее:
Arithmetic Expansion Arithmetic expansion allows the evaluation of an arithmetic expression and the substitution of the result. The format for arithmetic expansion is: $((expression))
Что-либо посаженное в двойной parens становится математическим выражением это bash
оценит.
Это - арифметическое расширение. Это поддерживается во всех оболочках POSIX (это не существовало в исходной Оболочке Bourne). Синтаксис арифметического выражения является главным образом тем же как на языке C.
Можно использовать переменные с или без a $
в арифметическом выражении. Без a $
, переменная стоит как переменная и может в особенности быть присвоена; например, echo $((a=4)) $a
печать 4 4
. С a $
, оболочка выполняет простое текстовое расширение; например, a=2+2; echo $(($a))
печать 4
тогда как a=2+2; echo $((a))
ошибка (но печатает 4 на некоторых оболочках так или иначе).
Точные правила для решения, ли $((
начинает замену команды ($(command)
где команда, оказывается, начинается с вводной круглой скобки) или арифметическое выражение ($((expression))
) варьируйтесь от оболочки до оболочки. Если Вы хотите выполнить замену команды, и команда начинается (
, поместите пространство для сейфа: $( (echo hello))
(такие команды редки, который является, почему синтаксис мог быть добавлен без любой практической опасности беспорядка).