2010-11-11 2 views
0

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

gawk 'NF \!= 6' file 

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

gawk 'NF != 6' file 

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

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

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

gawk: ^backslash not last character on line 

Кто-нибудь?

ответ

2

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

gawk "NF \!= 6" file 

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

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

1

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

$ gawk 'NF \ 
!= 6' file 

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

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

1

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

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

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

1

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

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

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

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

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

Смежные вопросы