Заполните число нулем

Я не думаю, что это возможно на уровне макросов, он собирается зависеть от команд в макросе. Однако макросы стали более гибкими, так как я изучил Emacs, таким образом, возможно, что я пропускаю что-то.

Emacs предлагает другую возможность работать со стороны файла: сужение. Выберите регион, Вы хотите работать с, и нажатие C-x n n (narrow-to-region) сузить буфер к выбранному региону. Теперь часть вне региона скрыта, и все команды будут влиять только на видимую часть.Пресса C-x n w (widen) вернуться к работе над целым файлом.

Функцией это часто удобно вместе с сужением, являются косвенные буферы. Выполненный M-x clone-indirect-buffer или C-x 4 c получить второй буфер, редактируя тот же файл. Два буфера имеют то же содержание, и сохраняющий любого сохранил файл, но буферы имеют отдельные регионы, режимы и видимость, таким образом, можно использовать сужение в одном и удержать целое представление файла другой.

6
21.11.2018, 00:39
4 ответа

Не помещайте "0" в начале числа - оно рассматривает число в восьмеричной основе. Просто присвойте десятичный номер.

a=10    
printf "%04d" $a    
0010    

При чтении чисел из где-то в другом месте можно рассмотреть удаление 0s вначале следующим образом:

a=0010    
b=$(echo $a | sed 's/^0*//')    
printf "%04d" $a    
0008
printf "%04d" $b    
0010    
14
27.01.2020, 20:20
  • 1
    b= (повторяют $a | sed 's/^0*//'), $ –  user43067 26.08.2013, 11:36
  • 2
    можно также использовать sudo -s ---------121 эхо--------203824----просто печатает значение переменной a, который затем перенаправляется к sed (использующий | символ). Теперь, sed получает строку (т.е. значение a) и удаляет весь 0s вначале. Символ ^ указывает на начало строки; 0* означает, что любое количество не обнуляет включая ни один. Это по существу возвращает Вас число со всем 0s, если таковые имеются, вначале удаленный. Это значение затем присвоено новой переменной, названной b. –  Barun 26.08.2013, 12:17
  • 3
    терминала сценария оболочки или Linux, whipe бесполезный канал! Записать b=$(sed s/^0*// <<<"$a") –  F. Hauri 14.03.2017, 08:52

Под POSIX

Можно отбросить левых 0 символ со следующим:

a=00010
while [ "$a" != "${a#0}" ] ;do a=${a#0};done
printf "%08d" $a
00000010

Поскольку это не разветвляет новую сессию команды, это могло быть более быстро, чем использование sed.

Под

Можно вызвать десятичную интерпретацию со следующим синтаксисом:

a=000010
printf "%08d" $((10#$a))
00000010

Это могло быть полезно для преобразований:

a="0a"
printf "%04d" $((16#$a))
0010

a="00001010"
printf "%04d" $((2#$a))
0010

a="00012"
printf "%04d" $((8#$a))
0010

a="0020"
printf "%04d" $((5#$a))
0010

a="0013"
printf "%04d" $((7#$a))
0010

и так далее...

a="zz"
printf "%04d" $((36#$a))
1295
10
27.01.2020, 20:20
  • 1
    b= ($a эха | sed 's/^0*//'), что точно делает этот шаг?? –  user43067 26.08.2013, 11:37
  • 2
    @user43067 $() генерируйте новую сессию команды (ветвление), echo $a будет работать на этой новой сессии, чем | sed генерирует новую сессию команды для передачи по каналу к /bin/sed внешний двоичный файл. –  F. Hauri 26.08.2013, 17:40

Можно выполнить это при помощи другого спецификатора преобразования, например, "f" спецификатор. Из printf руководства:

f, F

Двойной аргумент округлен и преобразован в десятичную запись в стиле [-] ddd.ddd, где количество цифр после символа десятичной точки равно спецификации точности. Если точность отсутствует, она взята в качестве 6; если точность является явно нулем, никакой символ десятичной точки не появляется. Если десятичная точка появляется, по крайней мере одна цифра появляется перед нею.

Но мы действительно не хотим представления с плавающей точкой Вашего числа, таким образом, мы должны указать точность нуля. Это должно сделать это:

a=010
printf "%04.0f" $a

Я предполагаю, что Вы используете Linux, но это должно также работать с другими ароматами Unix.

5
27.01.2020, 20:20
  • 1
    Или, от man printf, Вы могли использовать: printf "%04g" 010! +1, интересный способ исследовать также... –  F. Hauri 26.08.2013, 17:51

typeset -Z4 a будет работать с zsh или ksh.

При интерпретации как число, В POSIX sh и printf, если существует начальный нуль, это интерпретируется как восьмеричное число. Так, необходимо разделить их 0s сначала:

printf '%04d\n' "${a#"${a%%[!0]*}"}"

Или Вы могли использовать awk это не имеет той проблемы:

awk 'BEGIN{printf "%04d\n", ARGV[1]}' "$a"
4
27.01.2020, 20:20

Теги

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