Замена символов в диалплане Asterisk

Я хочу изменить пару символов * # для A и P, чтобы имя файла монитора было более удобным. Единственное решение, которое я смог найти, состояло в том, чтобы сделать это самостоятельно в диалплане, но оно генерирует много подробностей и не так эффективно (быстро), как хотелось бы. Я опубликую его здесь на всякий случай, если кто-то захочет его использовать. Но я ищу функцию звездочки, которую я могу скомпилировать, что-то, что я могу вызвать с диалпланом, например ${REPLACE(${EXTEN},*,a)}, и преобразовать exten **123**456*** до АА123АА456ААА.

;
; MACRO REPLACE
;
[macro-replace]
;
;   ${ARG1} - String source
;   ${ARG2} - Chars to replace
;   ${ARG3} - Chars to replace with
;
exten => s,1,NoOp(Replacing ${ARG2} for ${ARG3} in ${ARG1})
exten => s,n,Set(str=${ARG1})
exten => s,n,Set(find=${ARG2})
exten => s,n,Set(replace=${ARG3})
exten => s,n,Set(i=0)
exten => s,n,Set(length=${LEN(${str})})
exten => s,n,While($[${i} < ${length}])
exten => s,n,GotoIf($["${str:${i}:1}" != "${find}"]?continue)
exten => s,n,Set(pre=)
exten => s,n,GotoIf($["${i}" = "0"]?post)
exten => s,n,Set(pre=${str:0:${i}})
exten => s,n(post),Set(post=)
exten => s,n,GotoIf($["${i}" = $[${length} - 1]]?write)
exten => s,n,Set(post=${str:$[${i} + 1]})
exten => s,n(write),Set(str=${pre}${replace}${post})
exten => s,n(continue),Set(i=$[${i} + 1])
exten => s,n,EndWhile
exten => s,n,Set(REPLACERESULT=${str})


person JorgeO    schedule 17.12.2009    source источник
comment
Мне жаль, что вам приходится все это печатать. В Python это просто 123***ABC###.replace('*','A').replace('#',P)   -  person Hamish Grubijan    schedule 18.12.2009
comment
ржу не могу. Я чувствовал себя ужасно, когда писал это. Но лучше, чтобы моя первая попытка вызвать System (используйте sed для замены regex|pipe вывода с помощью asterisk -rx database put REPLACERESULT) каждый вызов займет до 1 секунды для выполнения этой строки.   -  person JorgeO    schedule 18.12.2009


Ответы (3)


Теперь функция REPLACE() делает это легко:

exten => 100,1,Set(find=**123**456***)
same => n,NoOp(find=${find})
same => n,Set(replace=${REPLACE(find,*,A)})
same => n,NoOp(find=${find}, replace=${replace})
same => n,hangup()

Вывод:

*CLI> channel originate local/100@default extension null@default
    -- Executing [100@default:1] Set("Local/100@default-c758;2", "find=**123**456***") in new stack
    -- Executing [100@default:2] NoOp("Local/100@default-c758;2", "find=**123**456***") in new stack
    -- Executing [100@default:3] Set("Local/100@default-c758;2", "replace=AA123AA456AAA") in new stack
    -- Executing [100@default:4] NoOp("Local/100@default-c758;2", "find=**123**456***, replace=AA123AA456AAA") in new stack
    -- Executing [100@default:5] Hangup("Local/100@default-c758;2", "") in new stack
  == Spawn extension (default, 100, 5) exited non-zero on 'Local/100@default-c758;2' 
person NTUI    schedule 03.01.2013
comment
Как бы вы заменили запятую? Это не анализирует: ${REPLACE(find,,,A)} - person blueFast; 25.02.2015
comment
вы можете использовать escape: так, будет \, - person duccom; 01.02.2017

Это действительно лучший способ сделать это (без использования регулярных выражений). Если вы хотите использовать regex (регулярные выражения), Asterisk 1.1+ полностью поддерживает его. Это позволит вам сделать весь макрос в одной строке. Документация по использованию регулярных выражений в диалплане находится здесь: voip-info.

Надеюсь, это поможет! На этой странице voip-info есть множество примеров, которые должны вам помочь!

person rdegges    schedule 17.12.2009
comment
Поправьте меня, если я ошибаюсь, но когда я прочитал статью, похоже, что реализация регулярного выражения в звездочке помогает вам найти совпадение, отлично подходит для GotoIf. Но как бы вы заменили с помощью регулярного выражения? - person JorgeO; 18.12.2009

Другой альтернативой тому, что вы сделали, является использование сценария AGI. Просто напишите свой код на bash/python/etc и используйте его как AGI (replace,${arg1},${arg2},${arg3}). Может быть не так быстро, как внутренняя функция, но она более компактна и потенциально быстрее, чем ваше решение.

person Farid Fadaie    schedule 21.01.2010