У меня есть файл с именем regeces
, содержащий ряд построчных регулярных выражений. Вот пример:
The .* is .* years old
I like .* with lots of .*
У меня также есть очень креативный файл данных, который называется data
:
The car is 3 years old
I like pizza with lots of pepperoni
I like tacos with lots of cheese
The house is 10 years old
A non-matching line
The couch is 5 years old
I like customers with lots of money
This line does not match
Хотя регулярные выражения, конечно, написаны не так узко, их достаточно, чтобы они соответствовали всем, кроме пятой и последней строкам data
, и объясняли мою проблему. Теперь вот моя программа:
#!/usr/bin/awk -f
BEGIN {
while ("cat regeces" | getline)
{
reg = "/" $0 "/||" reg
}
sub(/\|\|$/, "", reg)
print reg
}
# $0 ~ /I like .* with lots of .* /||/The .* is .* years old/ {
$0 ~ reg {
print $0
}
Итак, в разделе BEGIN
он читает regeces
, создает одно регулярное выражение и сохраняет его в переменной. В качестве средства устранения неполадок он также распечатывает его. В теле он сравнивает каждую строку с регулярным выражением, сохраненным в переменной. Закомментированная строка для удобства тестирования проблемы.
Регулярное выражение, хранящееся в reg
:
/I like .* with lots of .* /||/The .* is .* years old/
Теперь, если я запускаю программу как написано, она выводит каждую строку; то есть он не исключает пятую и последнюю строки data
. Однако, если я возьму приведенное выше регулярное выражение и заменим сравнительный тест программы:
$0 ~ /I like .* with lots of .* /||/The .* is .* years old/
работает отлично! Таким образом, регулярное выражение выглядит вполне нормально, но по какой-то причине поместить его в переменную и проверить его не удается. Это почему? Что бы это исправить? Очевидно, что регулярные выражения могут быть сохранены в переменных, но в чем проблема с этим?