У меня есть текстовый файл размером около 300 КБ. Я хочу удалить все строки из этого файла, которые начинаются с буквы "P". Это то, что я использовал:

> cat file.txt | egrep -v P*

Это не выводится на консоль. Я могу использовать cat для файла без каких-либо других команд, и он печатается нормально. Мое окончательное намерение:

> cat file.txt | egrep -v P* > new.txt

Ошибка не появляется, она просто ничего не печатает, и если я запускаю вторую команду, new.txt будет пустым.

редактировать: я должен сказать, что я работаю под управлением Windows 7 с установленным Cygwin.

2 ответа2

2

Попробуйте эту команду вместо:

cat file.txt | egrep -v '^P*' > new.txt

Альтернатива, которая избегает бесполезного использования кошки, была бы:

egrep -v '^P*' file.txt > new.txt

Вам нужно поместить кавычки вокруг ваших регулярных выражений в egrep, в противном случае bash расширит их (в вашем случае глобус * развернется до каждого файла в текущем каталоге, начиная с заглавной буквы P).

0

P* в качестве регулярного выражения означает «любое количество P s, включая 0». Так что оно всегда будет совпадать, так как каждая строка содержит не менее 0 P s. Это объясняет, почему egrep -v P* ничего не печатает: каждая строка совпадает, а -v выбирает строки, которые не совпадают. (На самом деле, это может сделать что-то еще, так как P* будет расширен bash в список файлов, начинающихся с буквы P в текущем каталоге, если таковые имеются. Вы должны использовать кавычки egrep -v "P*" , но это не ваша проблема.)

Вы хотите соответствовать один P в начале строки. Таким образом, вам нужно указать, что регулярное выражение "привязано" (соответствует только в начале), что вы делаете, помещая ^ в начале:

grep -v ^P file.txt > new.txt

Кстати, egrep устарела; Вы должны использовать grep -E , но в этом случае нет разницы между основным и расширенным регулярным выражением.

grep не использует "globs", он использует регулярные выражения. И это не заставляет регулярное выражение соответствовать всей строке; достаточно, если строка, соответствующая регулярному выражению, появляется где-то в строке.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .