2013-10-15 1 views
5

Я смог понять из GNU page of GAWK, что он может обрабатывать разделители данных с использованием переменной FPAT, но я не могу это сделать. Для файла CSV значение FPAT является:awk Переменная FPAT: Работа

FPAT = "([^,]+)|(\"[^\"]+\")" 

Используя данные:

abc,"pqr,mno" 

Первое сгруппированных выражение всему т.е. не запятая, это следует принимать "abc" как данные, затем не для первого появление запятой. Теперь мой вопрос - что будет дальше? Поскольку первое сгруппированное выражение не сработало, будет ли регулярное выражение продолжаться от символа после запятой, используя условие или? но первое сгруппированное выражение остается действительным для всех данных после запятой, поэтому в качестве следующих данных может потребоваться "pqr?

ответ

5

Таким образом, шаблоны полей описываются следующим образом.

Строка, не содержащая запятую, где длина строки больше нуля (не будет соответствовать пустые строки):

[^,]+ 

Или строка начинается и заканчивается с двойными кавычками и содержащий, по меньшей мере, один символ, который не двойные кавычки (выделяющиеся обратные косые опущены для удобства чтения):

 
"[^"]+"  

регулярное выражение двигателя с начала Strin g и попытайтесь как можно больше сопоставить шаблоны.

abc,"pqr,mno" 

Так abc это длинная строка соответствует шаблону либо с начала строки и, следовательно, становится $1. Следующий символ , не может быть сопоставлен ни одним шаблоном, поэтому механизм регулярного выражения просто перемещается к следующему символу " с началом сопоставления второго шаблона. Это соответствует до конца строки, так как "pqr,mno" - это строка, которая начинается и заканчивается двойными кавычками и содержит по крайней мере один символ без двойных кавычек. Поэтому "pqr,mno" становится $2 для записи abc,"pqr,mno".

+1

Мой вопрос в том, почему регулярное выражение начиналось со второго паттерна в ", оно всегда может идти за [^,], потому что данные не являются запятыми. Поскольку regexp жадный, он просто ищет первое совпадение, правильно? – ghub24

+0

Спасибо sudo_O, высоко оцененный. – ghub24

+0

@ user1844303 он будет работать дольше всех. Легким испытанием является переключение порядка двух регулярных выражений. –