Это может звучать сумасшедшим, но у меня есть идея, что Ваш BIOS является фруктовым.
Первое дело, которое я сделал бы, если бы моя система дала тот результат, состояло бы в том, чтобы идти к веб-сайту производства материнских плат и загрузить последний BIOS. Затем я использовал бы "сбой BIOS безопасные значения по умолчанию" и попробовал бы еще раз. Если это работает, переключатель к "оптимизированным значениям по умолчанию".
Это предполагает, что существует некоторый нечисловой текст после числа:
echo "loremipsumdolorsit2367amet" \
| sed -r -e 's/[0-9]/0000000&/' -e 's/0*([0-9]{8}[^0-9])/\1/'
Результат: loremipsumdolorsit00002367amet
Это не предполагает что:
... | sed -r -e 's/[0-9]/0000000&/' -e 's/0*([0-9]{8}([^0-9]|$))/\1/'
Они используют ДО шаблоны для sed. Много sed реализаций используют -r
флаг для определения этого; некоторое использование -E
флаг; некоторое использование оба. В настоящее время способность использовать ДО шаблоны в sed не является частью стандарта POSIX, но был разговор о добавлении его к стандарту. Я не встретился с современной sed реализацией, которая не имеет способности использовать ДО шаблоны так или иначе.
В некоторых случаях существуют вещи, можно сделать использование ДО шаблоны, что Вы не можете сделать использования значения по умолчанию sed шаблоны (BREs). См. комментарии к этому ответу. Но в данном случае, использование ДО шаблоны только для удобства. Как sch говорит в комментарии, можно опустить -r
(или -E
) флаг, и просто заменяет (...)
с \(...\)
и {8}
с \{8\}
. Мой исходный ответ используется +
, который является также не частью шаблонов BRE; но на самом деле это не было необходимо для решения.
С любым sed:
sed 's/[0-9]\{1,\}/0000000&/g;s/0*\([0-9]\{8,\}\)/\1/g'
0*\([0-9]\{8,\}\)
другое хорошее решение не требования нечислового текста после чисел. Это более изящно, чем, что я предложил в своем отредактированном ответе, хотя мое предложение также работает---, пока исходные числа никогда не превышают 8 цифр, которые действительно предусматривает вопрос. Но мне действительно нравится стратегия, которую Вы использовали.
– dubiousjim
16.10.2012, 18:14
[0-9]
s к [0-9a-fA-F]
для шестнадцатеричного числа. Я просто столкнулся с этой проблемой, хорошее решение btw.
– MarcusJ
16.04.2018, 04:24
Это возможно с жемчугом:
perl -e 'my $a="loremipsumdolorsit2367amet"; $a =~ s/([0-9]+)/sprintf("%010d",$1)/e; print $a'
Добрался:
loremipsumdolorsit0000002367amet
Обработать все входные строки:
perl -pe 's/([0-9]+)/sprintf("%010d",$1)/e'
Используя циклы в sed:
echo loremipsumdolorsit2367amet | sed -r -e :a -e 's/([^0-9])([0-9]{1,7}[^0-9])/\10\2/;ta'
Гуру.
Также не sed, но вот - немного замысловатый - (GNU) awk альтернатива:
echo loremipsumdolorsit2367amet | awk '{gsub( /[0-9]+/, sprintf( "%08d", gensub(/[^0-9]/, "","g"))); print}'
loremipsumdolorsit00002367amet
-r
, использование других-E
. Некоторые принимают обоих. – dubiousjim 16.10.2012, 06:26-E
работавший для меня. Что определяют виды вещей, какой тип sed каждый имеет? гну – sourisse 16.10.2012, 06:31-r
, так также BusyBox sed, FreeBSD принимает обоих, похож на Mac OS X, принимает только-E
. большое спасибо – dubiousjim 16.10.2012, 06:34+
с\{1,\}
и(...)
с\(...\)
и{...}
с\{...\}
и это будет стандартно, и Вы не должны будете волноваться. (<<<не является стандартным ни один), – Stéphane Chazelas 16.10.2012, 10:08