2016-05-22 4 views
2

Я пытаюсь придумать регулярное выражение для следующего случая: мне нужно найти пути сопоставления с использованием grep для следующих путей:Regex для верхнего регистра совпадает с запретами

  • Включать все прописные пути соответствия , Пример:

    ком/Foo/бар/1.2.3-SNAPSHOT/Бар-1.2.3-SNAPSHOT.jar

    Обратите внимание на капитал B в Bar.

  • Исключить все пути соответствия верхнего регистра, которые содержат только SNAPSHOT и не имеют других прописных букв. Пример:

    ком/Foo/бар/1.2.3-SNAPSHOT/бар-1.2.3-SNAPSHOT.jar

Возможно ли это с grep?

ответ

5

Нечто подобное может сделать:

grep -vE '^([^[:upper:]]*(SNAPSHOT)?)*$' 

Разбивка:

-v будет возмещена матч (показать все не совпавшие строки -E позволило расширенные регулярные выражения

^        # Start of line 
(      )* # Capturing group repeated zero or more times 
    [^[:upper:]]*    # Match all but uppercase zero or more times 
       (SNAPSHOT)? # Followed by literal SNAPSHOT zero or one time 
          $ # End of line 
+1

Спасибо за простой пример и подробную разбивку для смертных, подобных мне! – carlspring

1

Если вы хотите получить файлы, соответствующие им. Я сделаю это так.

find . -type f -regex '.*[A-Z].*' | while read -r line; do echo "$line" | sed 's/SNAPSHOT//g' | grep -q '.*[A-Z].*' && echo "$line"; done 
+0

Спасибо за ваш пример! К сожалению, я могу принять только один ответ ... – carlspring

1
..

Просто используйте awk:

$ cat file 
com/foo/Bar/1.2.3-SNAPSHOT/Bar-1.2.3-SNAPSHOT.jar 
com/foo/bar/1.2.3-SNAPSHOT/bar-1.2.3-SNAPSHOT.jar 

С GNU AWK или Mawk для gensub():

$ awk 'gensub(/SNAPSHOT/,"","g")~/[[:upper:]]/' file 
com/foo/Bar/1.2.3-SNAPSHOT/Bar-1.2.3-SNAPSHOT.jar 

С другими awks:

$ awk '{r=$0; gsub(/SNAPSHOT/,"",r)} r~/[[:upper:]]/' file 
com/foo/Bar/1.2.3-SNAPSHOT/Bar-1.2.3-SNAPSHOT.jar 
+0

Спасибо за подробный пример! К сожалению, я могу принять только один ответ ... – carlspring

1

Ну, вам нужно find перечислить все пути. Затем вы можете сделать это с помощью grep с двумя прогонами. Один включает все случаи капитализации. Другой исключает, что не содержат столиц кроме SNAPSHOT:

find . | grep '[A-Z]' | grep -v '.*\/[^A-Z]*SNAPSHOT[^A-Z]*$' 

Я думаю, что только последний Grep нуждается в объяснении:

  • grep -vисключает совпадающие строки
  • .*\/жадностью матчей все до первой косой черты. Всегда будет косая черта из-за find .
  • [^A-Z]* находит все символы, которые не являются прописными буквами. Поэтому мы применяем его до и после литерала SNAPSHOT, вплоть до конца строки.

Here вы можете играть с ним онлайн.

+0

Спасибо за ваш пример! К сожалению, я могу только принять один ответ ... – carlspring

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