Следующая ссылка может содержать ответ, который вы искали:
http://www.gnu.org/software/gawk/manual/html_node/Statements_002fLines.html
Он говорит, что в файлах скриптов AWK или в командной строке определенных оболочек, команды AWK могут быть разбиты на несколько строк в так же, как команды makefile. Просто закончите линию с обратной косой чертой (\
), и awk отменит символ новой строки при разборе. В сочетании с неявной конкатенацией строк (по аналогии с C), и решение может быть
BEGIN {
regexp = "[0-9]{10}," \
"[0-9]{3}[-.][0-9]{3}[.-][0-9]{4}," \
"\\([0-9]{3}\\)?[0-9]{3}-[0-9]{4}"
len = split(regexp, regs, /,/)
}
Тем не менее, я бы пользу решения, которое хранит регулярные выражения в массиве непосредственно: это лучше отражает намерение заявления и не заставляет программиста выполнять больше работы, чем требуется. Кроме того, нет необходимости в функции length
, так как можно использовать синтаксис foreach. Следует отметить, что массивы в awk похожи на карты на Java или словари на Python, поскольку они не связывают диапазон целочисленных индексов со значениями. Скорее они сопоставляют строковые ключи со значениями. Даже если в качестве ключей используются целые числа, они неявно преобразуются в строку. Таким образом, функция length
не всегда предоставляется, поскольку она вводит в заблуждение.
BEGIN {
regs[1] = "[0-9]{10}"
regs[2] = "[0-9]{3}[-.][0-9]{3}[.-][0-9]{4}"
regs[3] = "\\([0-9]{3}\\)?[0-9]{3}-[0-9]{4}"
}
{
for (i in regs) { # i recieves each key added to the regs array
if ($0 ~ regs[i]) {
print # by default `print' prints the whole record
break # we can stop finding a regexp
}
}
}
Обратите внимание, что команда break
выходит из цикла for
преждевременно. Это необходимо, если каждая запись должна печататься только один раз, даже если несколько регулярных выражений могут совпадать.
Я бы подумал, что, начиная с массива regs [] и помещая каждый шаблон в свою собственную ячейку, будет более самодокументированным, то есть 'regs [1] =" [0-9] {10} "' ... .. Я не уверен в том, какая разница между чем-то вроде '($ 0 ~/regex /) AND ($ 0 ~ regs [i])' будет работать. Кроме того, как бы вы предложили управлять изменениями в своем регулярном выражении по мере его увеличения и увеличения (трудно понять, где изменения, возможно, находятся на крайнем правом значении, и что более важно, если вам требуется запятая char ',', то у вас есть изменить свой разделитель! ;-)! Удачи. – shellter
Неправильное выражение в вашем регулярном выражении. 123.456-789 или 123-456.789. но их нет в вашем списке. вам может понадобиться группа. – Kent
Привет, Кент, спасибо вам за внимательный глаз. Могу ли я использовать группировку с формой «$ 0 ~ regs [i]» или мне нужно использовать gensub? – Chris