2015-07-16 3 views
1

Использование Grep или другой инструмент командной строки Мне нужно фильтровать список так, чтобы каждая строка, содержащая один или несколько из следующих символов исключены:Grep: список фильтрации с несколькими специальными символами

. 
/
- 
' 
[space] 

У меня с трудом выбегая из специальных символов при поиске нескольких экспонатов.

Это не работает:

grep -v '(.|/|-|'|)' input > output 

ответ

1

По умолчанию команда grep использует «Basic» формат регулярных выражений. Регулярное выражение, которое вы написали, находится в формате «Extended». Вы можете указать grep использовать расширенный формат с опцией -E.

Вы включили точку в своем регулярном выражении. Помните, что точка соответствует «любому» символу. Чтобы избежать его нормального поведения, вы можете либо сбежать от него с обратной косой чертой (\.), либо поместив его в диапазон ([.]). Я предпочитаю последнее обозначение, потому что обнаруживаю, что обратная косая черта усложняет чтение. Выбор ваш.

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

Вам также не нужны внешние скобки с этим регулярным выражением.

Итак ... Вы могли бы написать все это в базовой нотации:

grep -v "[.]\|/\|-\|'\| " input > output 

Или вы могли бы записать его в расширенной нотации:

grep -Ev "[.]|/|-|'| " input > output 

Или поочередно, вы можете положить все эти символы в диапазон, который записывается аналогично в Basic и Extended:

grep -v "[./' -]" input > output 

Обратите внимание, что дефис переместился в END диапазона, чтобы он не интерпретировался как «диапазон символов между косой чертой и одной цитатой». Заметим также, что, поскольку этот диапазон также совместим с нотой Basic RE, я удалил опцию -E.

Для получения более подробной информации см. man re_format(7).

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