обратная косая черта в полях gawk - PullRequest
0 голосов
/ 11 ноября 2010

Я только что проверил все мои выходные файлы с помощью gawk, которых я стараюсь избегать. Как работает

gawk 'NF \!= 6' file

отличается от

gawk 'NF != 6' file 

то есть, как обратная косая черта меняет значение этого выражения?

Должен ли он выводить строки с числом полей, отличным от 6 и заканчивающимся обратной косой чертой?

Я получаю следующую ошибку в моих файлах:

gawk:    ^ backslash not last character on line

Кто-нибудь?

Ответы [ 4 ]

2 голосов
/ 12 ноября 2010

Если вы используете двойные кавычки вместо одинарных кавычек, тогда ! является специальным символом и должен быть экранирован обратной косой чертой.Важно отметить, что вы избегаете восклицательного знака, так что ваша оболочка не видит его.

gawk "NF \!= 6" file

В двойных кавычках оболочка преобразует \! в ! перед передачей аргументапоглазетьОбратная косая черта исчезает к тому времени, когда вызывается gawk.

Однако, с одиночными кво, оболочка будет игнорировать ! символов, поэтому нет необходимости избегать их с обратной косой чертой.Фактически, как вы выяснили, это синтаксическая ошибка, поскольку обратная косая черта в конечном итоге передается gawk, что исключает неожиданный \.

1 голос
/ 27 ноября 2010

Независимо от того, используете ли вы двойные или одинарные кавычки, если вы используете подобную Борну оболочку, gawk увидит программу в точности так, как она отображается между кавычками. Даже в двойных кавычках как Bourne, так и csh-подобные оболочки используют только \ перед символами, которые могут нуждаться в экранировании (например, $, и в случае csh,! делай что хочешь).

! не имеет смысла пялиться в этом контексте, поэтому выдает ошибку. Для «вывода строк с количеством полей, отличных от 6 и заканчивающихся обратной косой чертой», используйте:

gawk 'NF != 6 && /\\$/' file

То есть: совпадать со строками, которые не имеют 6 полей и совпадают с \ непосредственно предшествующими концом строки ($). \ Должен быть экранирован с другой обратной косой чертой, потому что gawk тоже использует \ для экранирования - хотя в случае gawk все \ (кроме тех, которые экранированы другим \) поглощаются; те, которые не выходят за пределы специального символа, просто исключаются.

Без связанного действия, действие по умолчанию (вывести строку) будет выполнено, когда выполнено это условное утверждение.

1 голос
/ 12 ноября 2010

Если вы пытаетесь сопоставить строки, которые не имеют 6 полей и заканчиваются обратной косой чертой, это один из способов сделать это:

gawk -v 'patt=\\\\$' 'NF != 6 && $0 ~ patt' file

Gawk (и другие AWK) имеютнекоторые сложные правила, касающиеся выхода из обратной косой черты.Вот почему в предыдущей команде есть четыре обратных слеша.(Знак доллара представляет конец строки ввода из файла данных, как в любом регулярном выражении.)

1 голос
/ 12 ноября 2010

Линия без обратной косой черты работает как положено.Однако, если вы хотите знать, обратная косая черта обычно используется для выделения специальных символов (они теряют свое особое значение и используются сами по себе), а также для разделения длинных строк, чтобы вы могли написать что-то вроде (под оболочкой):

$ gawk 'NF \
!= 6' file

и это будет иметь тот же эффект.

Ваш пример, в частности, немного сложнее.Вы помещаете строку в одинарные кавычки.Это заставляет оболочку не изменять то, что вы пишете, а передавать ее программе.Если вы используете выражение обратной косой черты, gawk найдет '\' в месте, где оно не имеет смысла (в gawk оно используется только для разделения длинных строк и выделения символов в строках).В примере, который я написал с обратной косой чертой в две строки, gawk получает две строки, разделенные обратной косой чертой (концептуально одна строка).

...