Помогите с регулярным выражением и grep в терминале Linux - PullRequest
0 голосов
/ 13 июля 2010

Я новичок в регулярных выражениях и grep, но я пытался научиться этому, чтобы помочь мне при использовании консольных инструментов.

Я должен использовать cvs, и когда я обновляю некоторые файлы, янапример, не нужно видеть файлы, которые не были обновлены или имеют расширение * .pyc.Итак, я создал скрипт, который вызывает:

cvs update -d | grep -v 'pyc$' | grep -v '^\?'

Первый вопрос: почему cvs update -d | grep -v '(pyc$|^\?)' не работает, поэтому мне нужно использовать cvs update -d | grep -v 'pyc$' | grep -v '^\?'?

Второй вопрос: файлы, которыене были обновлены, начните со строки:

-f update: Updating FILE

Я пробовал grep -v '^\-f' и grep -v '^-f', но не повезло.Что не так с моим выражением?Это проблема регулярных выражений или что-то в Linux, о которой я не знаю?

Спасибо!

Ответы [ 2 ]

1 голос
/ 14 июля 2010

Я должен использовать cvs, и когда я обновляюсь некоторые файлы, мне не нужно видеть файлы которые не были обновлены или с * .pyc расширение например.

Если это реальная проблема (фактически две отдельные проблемы), которую вы хотите решить, использование grep для вывода из CVS является неправильным решением с самого начала.

Для pyc, вы должны добавить файл .cvsignore в ваш проект с одной строкой, которая говорит *.pyc, или добавить эту строку в существующий файл .cvsignore. Это заставит CVS полностью игнорировать все файлы pyc, а не перечислять их как неизвестные.

Файл .cvsignore применяется ко всем файлам и подкаталогам в папке, содержащей .cvsignore, поэтому, если все файлы pyc находятся в определенном подкаталоге проекта, вы добавите файл cvsignore в этот подкаталог, в противном случае просто добавьте его в корневой папке проекта.

Что касается игнорирования файлов, которые не были обновлены - я думаю, что вывод "cvs update: Updating foo", на который вы ссылаетесь, это скорее всего то, что cvs update печатает для каждого посещенного каталога в хранилище. Чтобы избавиться от этой распечатки, используйте флаг -q для CVS (этот флаг идет перед командой обновления, например: cvs -q update -d).

1 голос
/ 13 июля 2010

Отвечает только на часть вашего вопроса:

Вы должны использовать egrep вместо grep, поскольку | (чередование) и ( ) (группировка) поддерживаются только egrep.

РЕДАКТИРОВАТЬ:

Вторая проблема может возникнуть, так как cvs записывает некоторые строки в stderr, поэтому вам нужно будет перенаправить stderr в stdout, добавив 2>&1 к вашей команде.

...