2013-12-17 4 views
1

Я пытаюсь удалить строку со специальными символами, которая не имеет префикса \. Ниже приведены специальные символы:удалите строку со специальным символом с рисунком

^$%.*+?!(){}[]|\ 

мне нужно проверить все вышеуказанные специальные символы, которые не префиксом \ во 2-м столбце. Я пытаюсь с awk завершить это, но не повезло. Я хочу, чтобы результат был следующим.

input.txt

1,ap^ple 
2,o$range 
3,bu+tter 
4,gr(ape 
5,sm\(oke 
6,ra\in 
7,pla\\y 
8,wor\+k 

output.txt

1,ap^ple 
2,o$range 
3,bu+tter 
4,gr(ape 
6,ra\in 
+0

Ваш образец вывода не соответствует вашему описанию проблемы. Похоже, вы пытаетесь удалить все строки, содержащие один из специальных символов, которым предшествует обратная косая черта. –

ответ

2

Я считаю, что вы просто ищете:

awk '$2 !~ /\\[][|\\{}()!?+*.%$^]/' FS=, 

Это дает желаемый результат на данном входном файле, но совсем не соответствует описанию, данному в вопросе.

EDIT

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

awk '$2 ~ /[^\\][][|{}()!?+*.%$^]/' FS=, 

Это просто соответствует любой строке два символа, в котором первая не является обратной косой черты, а второй является одним из символов ][|{}()!?+*.%$^. Это терпит неудачу, потому что это не улавливает случай, когда особый символ встречается как первый элемент строки. Для этого мы расширяем регулярное выражение так, чтобы первый символ мог быть либо началом строки, либо чем-либо, что не является обратным слэшем.

awk '$2 ~ /(^|[^\\])[][|{}()!?+*.%$^]/' FS=, 

Причина, почему мы должны изменить порядок специальных символов, что ] имеет особое значение внутри скобок (а именно, он закрыл скобку!), И он должен быть списком первым, чтобы избежать этого значения. Аналогично, ^ должен не быть первым, потому что он имеет особое значение, когда он является первым членом класса символов (он отрицает класс). (Остальные символы не имеет значения;. Они только что заказаны как типографская авария)

+0

Внутри класса персонажа вам не нужно избегать трубы; он не имеет особого значения. –

+0

@ Джонатан Действительно. Интересно, что мой awk не генерирует предупреждение об этом. Кажется, что «gawk» очень * щедрый с этим конкретным предупреждением! –

+0

спасибо @ William, но он не дает точный результат, если входной файл содержит строку типа '7, p + la \\ y' – Marjer

1

Одна части трюка поставить специальные символы в класс символов безопасно, помня, что ], ^ и - (нет в вашем списке) имеют специальные правила, связанные с ними в классах символов. В частности, ^ как первый символ отрицает класс символов (поэтому размещайте его где-то иным, чем первый), а символ ] завершает класс символов, если он не является первым или вторым после ^.

Таким образом, вы хотите:

awk '/\\[]^$%.*+?!(){}[\\|]/ { next } { print }' input.txt 

комплекс (жуткая) регулярное выражение соответствует обратной косой черты, за которой следует один из специальных символов; действие - next, чтобы пропустить эту строку.{ print } (который также может быть записан 1 или любое другое истинное значение) печатает те строки, которые не устраняются регулярным выражением.

Пример вывода

1,ap^ple 
2,o$range 
3,bu+tter 
4,gr(ape 
6,ra\in 

Вы можете уточнить обработку игнорировать первое поле и так далее, как в William Pursell «s answer, который делает изменения порядка символов в списке, по существу, так же, как я сделал, но не объясняя почему.

awk -F, '$2 !~ /\\[]^$%.*+?!(){}[\\|]/ { print }' input.txt 
+0

спасибо @Jonathan, но он не дает точный результат, если вход файл содержит строку типа '7, p + la \\ y' – Marjer

+0

Какой у вас необходимый результат, когда есть специальный символ без обратной косой черты, а другой с обратной косой чертой? данные и описание не охватывают этот случай. –

+0

Извините @ Jonathan команда awk не работает, когда второй столбец имеет 2 специальных символа (один с обратной косой чертой без обратной косой черты). Я хочу эту строку также в output.txt '7, p + la \\ y' еще несколько примеров' 4, g) r (ap \ + e'. поскольку в столбце присутствует еще один специальный символ без обратного слэша Извините, я пропустил, чтобы описать это в описании. – Marjer

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