Я считаю, что вы просто ищете:
awk '$2 !~ /\\[][|\\{}()!?+*.%$^]/' FS=,
Это дает желаемый результат на данном входном файле, но совсем не соответствует описанию, данному в вопросе.
EDIT
Учитывая обсуждение в комментариях, представляется, что искомое решение должно вывести все строки, содержащие специальные символы, если этот символ не предшествует обратный слэш. Учитывая это описание, мы должны удалить обратную косую черту из списка специальных символов. A (нерабочим, даны с целью описания) раствора:
awk '$2 ~ /[^\\][][|{}()!?+*.%$^]/' FS=,
Это просто соответствует любой строке два символа, в котором первая не является обратной косой черты, а второй является одним из символов ][|{}()!?+*.%$^
. Это терпит неудачу, потому что это не улавливает случай, когда особый символ встречается как первый элемент строки. Для этого мы расширяем регулярное выражение так, чтобы первый символ мог быть либо началом строки, либо чем-либо, что не является обратным слэшем.
awk '$2 ~ /(^|[^\\])[][|{}()!?+*.%$^]/' FS=,
Причина, почему мы должны изменить порядок специальных символов, что ]
имеет особое значение внутри скобок (а именно, он закрыл скобку!), И он должен быть списком первым, чтобы избежать этого значения. Аналогично, ^
должен не быть первым, потому что он имеет особое значение, когда он является первым членом класса символов (он отрицает класс). (Остальные символы не имеет значения;. Они только что заказаны как типографская авария)
Ваш образец вывода не соответствует вашему описанию проблемы. Похоже, вы пытаетесь удалить все строки, содержащие один из специальных символов, которым предшествует обратная косая черта. –