Повторение шаблона и regexp

Я всегда делаю lsof | grep file/filesystem перечислять открытые или "используемые" файлы.

Человекочитаемый вывод "df" мог бы быть полезным также: df -h /mountpoint

1
18.09.2013, 06:00
2 ответа

В принципе да, но это может зависеть от regex разновидности, которую Вы используете. По крайней мере BRE, ДО и PCRE будет все соответствовать той строке. Выражение [UGLER]* средства соответствуют 0 или больше последовательным символам от набора U, G, L, E или R.

Можно протестировать это на различные типы regex достаточно легко:

  • BRE

    $ echo UUG | grep '[UGLER]*'
    UUG
    
  • ДО

    $ echo UUG | grep -E '[UGLER]*'
    UUG
    
  • PCRE

    $ echo UUG | grep -P '[UGLER]*'
    UUG
    

Конечно, так как Вы ищете нуль или больше, он будет также соответствовать вещам, которые Вы не могли бы ожидать:

$echo "foobar" | grep  '[UGLER]*'
foobar

Если regex разновидность, которую Вы используете, поддерживает его, используйте + вместо *. Например, с PCRE:

 $echo -e "UUG\nfoobar" | grep -P '[UGLER]*'
 UUG
 foobar
 $echo -e "UUG\nfoobar" | grep -P '[UGLER]+'
 UUG
5
27.01.2020, 23:15
  • 1
    вся regexp поддержка ароматов + - но некоторые требуют, чтобы Вы записали это как \+ –  cas 18.09.2013, 06:19
  • 2
    @CraigSanders OK, спасибо. Я не хотел делать вывод потому что кто знает существует некоторый неясный regex механизм с 60-х, который только работает в LISP-компьютерах и имеет его собственный странный синтаксис ;). –  terdon♦ 18.09.2013, 06:20
  • 3
    @CraigSanders, нет, стандартные BRE не поддерживают \+, это - GNUism. Посмотрите там для получения дополнительной информации. –  Stéphane Chazelas 18.09.2013, 09:08
  • 4
    Stephane является (конечно), правильным. Для мобильности, вместо [UGLER]+, использовать [UGLER][UGLER]* (т.е., одно происшествие, сопровождаемое 0, 1 или многие происшествие) –  Olivier Dulac 18.09.2013, 11:46
  • 5
    @OlivierDulac, отметьте это grep -E '[UGLER]+' и grep '[UGLER]\{1,\}' являются стандартными, это справедливо grep '[UGLER]\+' это не. –  Stéphane Chazelas 18.09.2013, 15:39

При предположении, что шаблон является fileglob шаблоном и не regexp, затем да, он будет соответствовать имени файла под названием 'UUG'. Шаблон будет соответствовать любому файлу, запускающемуся с U, G, L, E, или R.

можно протестировать это сами с:

touch UUG
ls -l [UGLER]*

Если шаблон будет regexp, то он будет соответствовать ЛЮБОЙ строке, потому что Вы соответствуете против zero-more экземпляров [UGLER]. Если Вы хотите соответствовать 1-more, а не zero-more, то используйте + вместо *

1
27.01.2020, 23:15

Теги

Похожие вопросы