RegEx для замены текста между двумя хеш-символами, между двумя тегами, но с сохранением всего остального

Поэтому мне нужно заменить #var# и #var2# на <cfqueryparam value="#var#" /> и <cfqueryparam value="#var2#" />. Однако это должно происходить только тогда, когда #var# заключен в <cfquery></cfquery>.

В качестве дополнительного критерия тег cfquery будет содержать текст до и после хэш-символов. Вот пример:

<cfquery datasource="#tablename#">
   SELECT * FROM table WHERE name = #var#, somethingelse = #var2#;
</cfquery>

Мне нужно регулярное выражение, которое соответствует 'test' только тогда, когда оно находится между двумя хэш-символами и внутри тега cfquery, который может иметь или не иметь атрибуты.

Я использую grepWin для замены.


person Torbjørn Angeltveit    schedule 28.05.2015    source источник
comment
Используйте синтаксический анализатор XML для анализа вашего XML. Затем используйте регулярное выражение для обработки простого содержимого тега.   -  person Sergey Kalinichenko    schedule 28.05.2015
comment
В показанном вами примере переменная, вероятно, будет заключена в одинарные кавычки. У вас наверняка есть другие запросы, которых не будет. Вы также ничего не делаете с типами данных или нулевыми атрибутами. Кроме того, переменные в запросах могут использоваться таким образом, что параметры запроса неуместны. Учитывая все обстоятельства, это выглядит как плохой план.   -  person Dan Bracuk    schedule 28.05.2015
comment
Будем разбираться, спасибо! У меня есть около 1000 файлов для этого. Какие-нибудь программы приходят на ум, которые будут выполнять синтаксический анализ XML и процесс регулярных выражений в подпапках?   -  person Torbjørn Angeltveit    schedule 28.05.2015


Ответы (2)


Еще одно решение с регулярным выражением:

Вы можете использовать следующее для соответствия:

(#[^#><]*#)(?=[^>]*<\/cfquery>)

И заменить на:

<cfqueryparam value="$1" />

См. DEMO.

person karthik manchala    schedule 28.05.2015
comment
Это приятно! Прямо к делу и отвечает на то, что я спросил. Благодарю вас! - person Torbjørn Angeltveit; 28.05.2015
comment
Очень хорошее решение, например, как вы добавили демо! +1 - person ShellFish; 28.05.2015
comment
Рад, что вы так думаете.. :) - person karthik manchala; 28.05.2015

Стратегия

Вы можете использовать awk, это достаточно просто. В псевдокоде мы попробуем следующее:

look for occurrence of cfquery
substitute as desired
until /cfquery is found

Скрипт

В результате получается следующий скрипт:

in_query {
    $0 = gensub(/(#[^#]+#)/, "<cfqueryparam value=\"\\1\" />", "g", $0)
}
/<cfquery.*>/ {
    in_query = 1
}
/<\/ *cfquery.*>/ {
    in_query = ""
}
{
    print $0
}

Использование

awk -f script.awk file
person ShellFish    schedule 28.05.2015
comment
С удовольствием, awk — мощный инструмент! - person ShellFish; 28.05.2015