Sed: расширение строки чисел к определенному числу цифр путем дополнения нулями

Это может звучать сумасшедшим, но у меня есть идея, что Ваш BIOS является фруктовым.

Первое дело, которое я сделал бы, если бы моя система дала тот результат, состояло бы в том, чтобы идти к веб-сайту производства материнских плат и загрузить последний BIOS. Затем я использовал бы "сбой BIOS безопасные значения по умолчанию" и попробовал бы еще раз. Если это работает, переключатель к "оптимизированным значениям по умолчанию".

6
28.03.2019, 03:17
5 ответов

Это предполагает, что существует некоторый нечисловой текст после числа:

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; но на самом деле это не было необходимо для решения.

10
27.01.2020, 20:20
  • 1
    Хм, когда я пробую это, я получаю ошибку sed: недопустимая опция---r –  sourisse 16.10.2012, 06:25
  • 2
    Различные семена использует различные флаги для расширенных шаблонов. Некоторое использование -r, использование других -E. Некоторые принимают обоих. –  dubiousjim 16.10.2012, 06:26
  • 3
    , большим. Переключение его к -E работавший для меня. Что определяют виды вещей, какой тип sed каждый имеет? гну –  sourisse 16.10.2012, 06:31
  • 4
    sed принимает -r, так также BusyBox sed, FreeBSD принимает обоих, похож на Mac OS X, принимает только -E. большое спасибо –  dubiousjim 16.10.2012, 06:34
  • 5
    Ни-r, ни-E не являются стандартными. Стандарт sed только принимает BRE (основные регулярные выражения). Просто замена + с \{1,\} и (...) с \(...\) и {...} с \{...\} и это будет стандартно, и Вы не должны будете волноваться. (<<<не является стандартным ни один), –  Stéphane Chazelas 16.10.2012, 10:08

С любым sed:

sed 's/[0-9]\{1,\}/0000000&/g;s/0*\([0-9]\{8,\}\)/\1/g'
9
27.01.2020, 20:20
  • 1
    Ваш 0*\([0-9]\{8,\}\) другое хорошее решение не требования нечислового текста после чисел. Это более изящно, чем, что я предложил в своем отредактированном ответе, хотя мое предложение также работает---, пока исходные числа никогда не превышают 8 цифр, которые действительно предусматривает вопрос. Но мне действительно нравится стратегия, которую Вы использовали. –  dubiousjim 16.10.2012, 18:14
  • 2
    [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'
5
27.01.2020, 20:20
  • 1
    Это интересно, спасибо. Для этой команды действительно ли возможно принять вывод канала вместо того, чтобы требовать, чтобы строка была введена как переменная? У меня есть много таких строк, таким образом введение их всех является слишком трудоемким... А-ч –  sourisse 16.10.2012, 06:27
  • 2
    @sourisse Gilles обновил мой ответ –  daisy 16.10.2012, 17:27
  • 3
    Единственная вещь я получил работу (с функцией cal в замене).Спасибо! –  Raphael 03.06.2013, 23:09

Используя циклы в sed:

echo loremipsumdolorsit2367amet | sed -r -e  :a -e 's/([^0-9])([0-9]{1,7}[^0-9])/\10\2/;ta'

Гуру.

2
27.01.2020, 20:20

Также не sed, но вот - немного замысловатый - (GNU) awk альтернатива:

echo loremipsumdolorsit2367amet | awk '{gsub( /[0-9]+/, sprintf( "%08d", gensub(/[^0-9]/, "","g"))); print}' 
loremipsumdolorsit00002367amet
2
27.01.2020, 20:20

Теги

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