Я не думаю, что это возможно на уровне макросов, он собирается зависеть от команд в макросе. Однако макросы стали более гибкими, так как я изучил Emacs, таким образом, возможно, что я пропускаю что-то.
Emacs предлагает другую возможность работать со стороны файла: сужение. Выберите регион, Вы хотите работать с, и нажатие C-x n n
(narrow-to-region
) сузить буфер к выбранному региону. Теперь часть вне региона скрыта, и все команды будут влиять только на видимую часть.Пресса C-x n w
(widen
) вернуться к работе над целым файлом.
Функцией это часто удобно вместе с сужением, являются косвенные буферы. Выполненный M-x clone-indirect-buffer
или C-x 4 c
получить второй буфер, редактируя тот же файл. Два буфера имеют то же содержание, и сохраняющий любого сохранил файл, но буферы имеют отдельные регионы, режимы и видимость, таким образом, можно использовать сужение в одном и удержать целое представление файла другой.
Не помещайте "0" в начале числа - оно рассматривает число в восьмеричной основе. Просто присвойте десятичный номер.
a=10
printf "%04d" $a
0010
При чтении чисел из где-то в другом месте можно рассмотреть удаление 0s вначале следующим образом:
a=0010
b=$(echo $a | sed 's/^0*//')
printf "%04d" $a
0008
printf "%04d" $b
0010
Можно отбросить левых 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
$()
генерируйте новую сессию команды (ветвление), 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.
man printf
, Вы могли использовать: printf "%04g" 010
! +1, интересный способ исследовать также...
– F. Hauri
26.08.2013, 17:51
typeset -Z4 a
будет работать с zsh
или ksh
.
При интерпретации как число, В POSIX sh и printf, если существует начальный нуль, это интерпретируется как восьмеричное число. Так, необходимо разделить их 0
s сначала:
printf '%04d\n' "${a#"${a%%[!0]*}"}"
Или Вы могли использовать awk
это не имеет той проблемы:
awk 'BEGIN{printf "%04d\n", ARGV[1]}' "$a"
sudo -s
---------121 эхо--------203824----просто печатает значение переменной a, который затем перенаправляется к sed (использующий | символ). Теперь, sed получает строку (т.е. значение a) и удаляет весь 0s вначале. Символ ^ указывает на начало строки; 0* означает, что любое количество не обнуляет включая ни один. Это по существу возвращает Вас число со всем 0s, если таковые имеются, вначале удаленный. Это значение затем присвоено новой переменной, названной b. – Barun 26.08.2013, 12:17b=$(sed s/^0*// <<<"$a")
– F. Hauri 14.03.2017, 08:52