Regex и переданные по каналу команды с sed

Эта проблема происходит при установке CD, также. Я получил зафиксированный путем выполнения sudo update-grub

2
26.03.2013, 19:19
2 ответа

Традиционные инструменты Unix поддерживают или BRE или ДО (основные или расширенные регулярные выражения). POSIX шифрует обоих. Википедия объясняет их. Большинство современных инструментов расширяется ДО, часто с дополнительными функциями, сначала представленными в Perl (который известен как PCRE).

ДО расширяет функциональность BRE, но не расширяет синтаксис. В BRE, только символы \[.*^$ имейте особое значение и некоторые операторы, такие как группировка \(…\) используйте обратные косые черты. В ДО, +?|() являются также особенными, и обратная косая черта, сопровождаемая небуквенно-цифровым знаком, никогда не является особенной.

BRE не имеет Python/PCRE's \d и \s. Можно выразить эти наборы символов традиционными конструкциями набора и классами символов: \d [[:digit:]] и \s [[:space:]]. Отметьте двойные скобки: один для указания на набор символов и один для указания на класс символов; например, “буквы, тире или символы нижнего подчеркивания” могут быть записаны [-_[:alpha:]].

BRE's не имеет a + оператор (некоторая sed поддержка реализаций \+ как расширение синтаксиса BRE); X+ совпадает с XX*. Группам и количествам соответствия нужны дополнительные обратные косые черты.

Эквивалент BRE Python \s+ up \s+(\d{1,2}):(\d{1,2}) таким образом [[:space:]][[:space:]]* up [[:space:]][[:space:]]*\([[:digit:]]\{1,2\}\):\([[:digit:]]\{1,2\}\). Обратите внимание соответствие слишком большому пробелу: \s+ и пространство означает по крайней мере два пробельных символа.

Необходимо будет соответствовать целой строке как sed's s команда переписывает строку. Нет отдельной команды для выписывания строки, собранной от сохраненных групп. Исправляя для дополнительного пробела, аналог Вашего отрывка Python:

uptime | sed 's/^.*[[:space:]][[:space:]]*up[[:space:]][[:space:]]*\([[:digit:]]\{1,2\}\):\([[:digit:]]\{1,2\}\).*$/\1h\2m/'

В отличие от отрывка Python, это извлекает первое соответствие, а не последнее соответствие, но это не имеет значения здесь.

Вывод uptime придерживается пробелов и цифр ASCII, таким образом, можно упростить regex:

uptime | sed 's/^.* up  *\([0-9]\{1,2\}\):\([0-9]\{1,2\}\).*$/\1h\2m/'

Это будет только соответствовать выводу uptime если машина возросла меньше 1 дня. Я оставлю соответствие количеству дней как осуществление. (Подсказка: запишите два выражения: sed -e s/AS ABOVE/\1h\2m/ -e 's/EXERCISE/\1d\2h\3m/')

4
27.01.2020, 21:57
  • 1
    , что ERE's + может быть записан \{1,\} в BREs. –  Stéphane Chazelas 27.03.2013, 02:28

Каждый инструмент использование (главным образом) их собственная библиотека RE. Даже среди различного sed версии Вы найдете различия здесь. Два популярных стандарта являются регулярными выражениями стандарта POSIX, много инструментов принимают их (по крайней мере, с некоторыми опциями), другой популярный набор является Perl Совместимая Библиотека регулярных выражений (PCRE). Но последние вполне несколько отличаются от "ванильного" REs...

В Вашем случае:

uptime | sed -e 's/^ \([0-9][0-9]\):\([0-9][0-9]\).*$/\1h\2m/'

(Испытанный Fedora 18, sed-4.2.1-10.fc18.x86_64, GNU sed).

Обновление: Что не так с обильной документацией относительно домашней страницы sed's GNU? Или это учебное руководство? Информационная документация для GNU sed немного многоречиво, но завершен.

1
27.01.2020, 21:57
  • 1
    Mmm хорошо, это хуже, чем я вообразил это. Я надеялся, что мог использовать некоторый синтаксис как \d{1,2} который я действительно нахожу полезными. Так или иначе на OS X команда Вы записали возвратам целый вывод uptime... LOL. Так или иначе, спасибо за ответ, я собираюсь учиться sed более глубоким способом. –  whatyouhide 26.03.2013, 19:43
  • 2
    Если Вы хотите такой синтаксис (не универсальный), Вы могли бы хотеть рассмотреть жемчуг, он имеет очень богатые шаблоны и является вполне дружественной остротой. И не, я никогда не утверждал, что был sed экспертом. –  vonbrand 26.03.2013, 19:58
  • 3
    Нет я не говорил, что, просто говорил это sed интересует меня так, я собираюсь изучать его глубоко, вероятно, :). –  whatyouhide 26.03.2013, 20:10
  • 4
    Ну конечно можно использовать что-то как \d {1,2}, а именно, [0-9] \{1,2\}. Синтаксис sed может быть немного выключен, и regexps не так мощны, но я нахожу это очень полезным для многих задач на командной строке –  jpmuc 26.03.2013, 22:05
  • 5
    @juanpa для этой проблемы, которая больше вводит (и больше взглядов ;-), чем мое решение. –  vonbrand 26.03.2013, 22:17

Теги

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