Разница между ~ / pattern / и ~ "pattern"? - PullRequest
2 голосов
/ 30 марта 2020

Итак, вопрос довольно прост: в awk if ( var ~ /pattern/ ) совпадает с if ( var ~ "pattern" )?

Я провел некоторый базовый c тест на CSV, и оба, кажется, дают тот же результат ... Есть ли какая-то тонкая разница, которую я пропустил?

1 Ответ

6 голосов
/ 30 марта 2020

Это очень хорошо объяснено в GNU awk документы в 3.6 Использование Dynami c Регулярные выражения

NOTE: При использовании ~ и !~ операторы, помните, что существует разница между константой регулярного выражения, заключенной в косые черты, и строковой константой, заключенной в двойные кавычки. Если вы собираетесь использовать строковую константу, вы должны понимать, что строка, по сути, сканируется дважды: в первый раз, когда awk читает вашу программу, и во второй раз, когда она соответствует строке слева. сторона оператора с рисунком справа.

Какая разница, если строка сканируется дважды? Ответ связан с escape-последовательностями, особенно с обратными слешами. Чтобы получить обратную косую черту sh в регулярное выражение внутри строки, you have to type two backslashes.

Простой демонстрационный пример, объясняющий разницу. При использовании константы регулярного выражения

echo 'foo*bar dude' | awk '$1 ~ /foo\*bar/'

и динамической строки c регулярного выражения, поскольку строка регулярного выражения в ".." дважды подвергается сканированию, вам потребуется дополнительная \ для экранирования добавленного \ для *

echo 'foo*bar dude' | awk '$1 ~ "foo\\*bar"'

Все символы escape-последовательности backsla sh под go это специальная обработка при использовании Dynami c регулярных выражений. Например, для экранирования \n в строке

echo 'foo\nbar dude' | awk '$1 ~ /foo\\nbar/'

и

echo 'foo\nbar dude' | awk '$1 ~ "foo\\\\nbar"'

В документации также четко поясняется, какой из них использовать

Строковые константы сложнее писать и труднее читать. Использование констант regexp делает ваши программы менее подверженными ошибкам. Непонимание различий между этими двумя типами констант является распространенным источником ошибок.

Более эффективно использовать константы регулярного выражения. awk может отметить, что вы предоставили регулярное выражение и сохранили его внутри в форме, которая делает сопоставление с шаблоном более эффективным. При использовании строковой константы awk должен сначала преобразовать строку в эту внутреннюю форму, а затем выполнить сопоставление с шаблоном.

Использование констант регулярного выражения является лучшей формой; это ясно показывает, что вы намереваетесь использовать регулярное выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...