Добавьте начальные символы перед строкой с помощью printf или эхом

RAID не имеет никакого отношения к LVM, это два различных понятия, и в различных целях.

Для создания раздела можно сделать это во время инструкции по установке (часть раздела), никакая потребность к команде выполнения вручную.

Прочитайте руководство здесь, и ссылки выше должны получить Вас основные идеи разделить.

6
09.05.2016, 01:17
5 ответов

Если вы можете использовать perl:

$ perl -e 'print sprintf "%020s\n","shortstring"'
000000000shortstring

Для более общих целей:

$ perl -e 'print sprintf "%020s\n",shift' shortstring
000000000shortstring

$ perl -e 'print sprintf "%020s\n", $_ for @ARGV' shortstring qwerty
000000000shortstring
00000000000000qwerty

Примечание

Некоторые платформы могут быть сформированы выходной строкой с ведущим нулем, по крайней мере, в AIX. С помощью GNU gcc вы получите предупреждение при компиляции:

$ cat test.c
#include <stdio.h>

int main() {
    printf("%08s\n", "qwerty");
    return 0;
}

Затем:

$ gcc -Wall test.c
test.c: In function ‘main’:
test.c:4:5: warning: '0' flag used with ‘%s’ gnu_printf format [-Wformat]

Если вы не хотите использовать perl, вы можете попробовать:

$ line=shortstring
$ printf "%0$((20-${#line}))d%s"  0  $line
000000000shortstring

Этот подход не работает, когда длина строки больше 20. Вы можете использовать ответ @mikeserv для обработки этого или воспользоваться проверкой перед printf.

1
27.01.2020, 20:23

Отдельная printf при необходимости может делать набивку 0 с помощью %0Xd.

zero_pad(){
  # zero_pad <string> <length>
  [ ${#1} -lt $2 ] && printf "%0$(($2-${#1}))d" ''
  printf "%s\n" "$1"
}

.

$ zero_pad "" 5
00000

$ zero_pad "over" 5
0over

$ zero_pad "under" 4
under

$ zero_pad "exact" 5
exact

$ zero_pad " space" 7
0 space
1
27.01.2020, 20:23

Просто сделайте набивку вручную. Не думаю, что есть более простое решение, если придерживаться инструментов POSIX.

while [ ${#line} -lt 20 ]; do
  line=0$line
done

или

n=${#line}
while [ $n -lt 20 ]; do
  printf '0'
  n=$((n-1))
done
printf "$line\n"

В zsh, конечно, есть синтаксис для этого. В отличие от фрагментов выше, этот усекает строку, если она длиннее 20 символов. Если вам не нужно усечение, вы можете добавить хвост строки.

print -r ${(l:20::0:)line}
print -r ${(l:20::0:)line}${line:20}
3
27.01.2020, 20:23

Как уже отмечал @Gnouc, вы уже на полпути:

line='some chars'
printf '%0'$((20-${#line}))'d%s\n' 0 "$line"

###OUTPUT###
0000000000some chars

Конечно, тогда вы все еще ветер вверх с 0, даже если строка длиннее 20 символов, и это только , если printf не выдает ошибку, потому что он неправильно обрабатывает тире - в строке формата (что, по-видимому, более вероятно) . Тем не менее, с этим легко справиться:

printf "%.$((((l=20-${#line})>0)*l))d%s\n" 0 "$line"

Эта строка формата использует printf %. ] флаг точности либо дополнить его десятичный аргумент нулями до указанной длины, либо - в t Событие %. 0d ноль или %. d пустая точность - в противном случае усечение любых ведущих нулей до указанного числа. Примерно так:

printf '#%.0d%c%.5d' 0000000 ':separator' 4 
#:00004

(примечание: формат % c печатает первый символ связанного с ним аргумента)

$ (( арифметическое выражение )) сначала устанавливает переменную $ l равной 20 минус $ {# line} , затем оценивает значение 0 или 1, если $ l меньше или больше 0 соответственно , и последний умножает это на $ l . Поэтому, когда 20 - $ {# line} меньше нуля, вы делаете $ ((0 * l)) , но когда оно больше, вы делаете $ ((1 * л)) .

Таким образом, вы всегда печатаете только столько ведущих нулей, сколько учитывается в разнице между 20 и $ {# line} . Вот так:

line='some chars'
printf "#%.$((((l=20-${#line})>0)*l))d%s\n" 0 "$line"
#0000000000some chars

И ...

line='some chars'
printf "#%.$((((l=4-${#line})>0)*l))d%s\n" 0 "$line"
#some chars

И можно использовать тот же %. precision форма для поля типа s , например:

line='some chars'
printf "#%.$((((l=4-${#line})>0)*l))d%.4s\n" 0 "$line"
#some

... для усечения по желанию.

Вот он в цикле - следующая итерация повторяется 5 раз:

line=
until line=fivec$line; [ $((l)) -lt 0 ] 
do  printf "#%.$((((l=20-${#line})>0)*l))d%s\n" 0 "$line"
done    
#000000000000000fivec
#0000000000fivecfivec
#00000fivecfivecfivec
#fivecfivecfivecfivec
#fivecfivecfivecfivecfivec

Важно отметить, что ни один из показанных нулей никогда не включается в значение какой-либо переменной оболочки - не говоря уже о $ line - и создаются автоматически только printf , как указано в его строке формата.

Вот тот же цикл с повышенной точностью %. 20s :

line=
until line=fivec$line; [ $((l)) -lt 0 ] 
do  printf "#%.$((((l=20-${#line})>0)*l))d%.20s\n" 0 "$line"
done    
#000000000000000fivec
#0000000000fivecfivec
#00000fivecfivecfivec
#fivecfivecfivecfivec
#fivecfivecfivecfivec

Еще одна вещь, которую вы можете сделать с этим, довольно забавная. Когда вы объединяете возможность printf динамически генерировать 0 с $ IFS , вы можете иметь любую строку сколько угодно раз, например:

IFS=0 ; printf '10 lines\n%s' $(printf %010d) ; unset IFS 

###OUTPUT###
10 lines
10 lines
10 lines
10 lines
10 lines
10 lines
10 lines
10 lines
10 lines
10 lines
3
27.01.2020, 20:23

Проблема была фактически в /etc/security/pam_mount.conf.xml . После некоторого урока я вставил строку

Мое понимание было то, что User =« * » было нотаутированием по телефону, стоящей для« любого пользователя ». Оказывается, такого синтаксиса нет. Поэтому PAM_MOUNT пытался установить громкость для пользователя * и, конечно, не удалось. Это было отражено в журналах по линии Crypt_Activate_by_Passefhrase: операция не разрешена .

Решино за счет замены * с именем моего пользователя. При необходимости MAN PAM_MOUNT.conf имеет дополнительные варианты для более мелкого зерна.

Так что, если вы когда-нибудь столкнетесь с проблемами с PAM_MOUNT , говоря Операция не разрешена Проверьте, первым!

-121--187208-

% s - это спецификация форматирования строки. Нулевой прокладку только , определенный для существующих для числовых преобразований :

0 для d, i, o, u, x, x, a, a, e, e, f, f, g , и G, указыватели преобразования G, ведущие нули (после любого указания знака или базы) используются для прокладки ширины поля ... Для других преобразований поведение не определено.

Если ваш $ line - это число, используйте:

printf '%020i\n' $line

, чтобы получить желаемый результат (или один из других идентификаторов цифровых форматов). Если ваше значение сложнее, но начинается с номера, вы можете использовать:

printf '%020i %s\n' $num $restofline

для объединения номера и строки вместе одновременно.

3
27.01.2020, 20:23

Теги

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