2011-02-08 3 views
2

Вот моя проблема в упрощенном сценарии.Использование непотребительских совпадений в Linux найти regex

Создать некоторые тестовые файлы:

touch /tmp/test.xml  
touch /tmp/excludeme.xml  
touch /tmp/test.ini  
touch /tmp/test.log 

У меня есть найти выражение, которое возвращает мне все XML и INI-файлы:

[[email protected]] ~> find /tmp -name -prune -o -regex '.*\.\(xml\|ini\)'  
/tmp/test.ini  
/tmp/test.xml  
/tmp/excludeme.xml  

теперь я хочу способ изменения этого -regex исключить файл excludeme.xml из включенного в результаты.

Я думал, что это должно быть возможно, используя/комбинируя нерегулярное регулярное выражение (?=expr) с отрицательным соответствием (?!expr). К сожалению, я не могу правильно получить формат команды, поэтому мои попытки не приводят к возврату матчей. Здесь был один из моих попыток (я пробовал много различных форм этого с различными побега!):

find /tmp -name -prune -o -regex '\(?=.*excludeme\.xml\).*\.\(xml\|ini\)' 

Я не могу разбить команду на несколько шагов (например, трубопроводы через grep -v) в качестве команды поиска принимается за вход в другие части нашего инструмента.

ответ

3

Это делает то, что вы хотите на Linux: "!"

find /tmp -name -prune -o -regex '.*\.\(xml\|ini\)' \! -regex '.*excludeme\.xml' 

Я не уверен, если оператор уникален для поиска gnu.

+0

Это прекрасно работает для меня, спасибо! –

0

Не уверен, что ускользает вам нужно или если lookarounds работать, но они работают на Perl:

/^(?!.*\/excludeme\.).*\.(xml|ini)$/

/(?<!\/excludeme)\.(xml|ini)$/

Edit - Только что проверил команда находкой, лучшее, что вы можете сделать с find - изменить regextype на -regextype posix-extended, но это не делает вещи вроде look-around. Единственный путь вокруг этого - использовать какой-то материал gnu, либо, как @unholygeek предлагает найти или найти трубку в gnu grep с опцией -P perl. Вы можете использовать приведенное выше регулярное выражение, если вы идете с gnu grep. Что-то вроде find .... -print | xargs grep -P ...

Извините, это лучшее, что я могу сделать.

+0

Я пробовал эти выражения с различными попытками экранирования, но я не мог заставить их работать в поисковом regex. :-( –

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