Эта проблема происходит при установке CD, также. Я получил зафиксированный путем выполнения sudo update-grub
Традиционные инструменты 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/'
)
Каждый инструмент использование (главным образом) их собственная библиотека 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
немного многоречиво, но завершен.
\d{1,2}
который я действительно нахожу полезными. Так или иначе на OS X команда Вы записали возвратам целый вывод uptime
... LOL. Так или иначе, спасибо за ответ, я собираюсь учиться sed
более глубоким способом.
– whatyouhide
26.03.2013, 19:43
sed
интересует меня так, я собираюсь изучать его глубоко, вероятно, :).
– whatyouhide
26.03.2013, 20:10
+
может быть записан\{1,\}
в BREs. – Stéphane Chazelas 27.03.2013, 02:28