Дополнить строку определенной длины выбранным символом (или шестнадцатеричным кодом) в Bash? - PullRequest
0 голосов
/ 30 мая 2018

Я хочу дополнить строку в Bash определенной длиной любым выбранным символом (или шестнадцатеричным кодом).

Предположим, у меня есть строка AABB и я хочу дополнить ее, используя X или (0x00) до длины 10:

AABBXXXXXX

Я знаю, как дополнять пробелы с помощью printf.Как я могу дополнить произвольный символ (или шестнадцатеричный код)?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Используйте printf, чтобы заполнить пробелами, затем замените пробелы выбранным символом.Некоторые примеры:

printf %-10s AABB | tr ' ' X print AABBXXXXXX.
printf %10s AABB | tr ' ' X print XXXXXXAABB.

Конечно, это работает только тогда, когда ваша строка не содержит пробелов.Чтобы вставить непечатаемые символы по их шестнадцатеричному коду, используйте строки bash c $'...'.

printf %10s AABB | tr ' ' $'\x1f', которые шесть раз напечатают непечатный символ 0x1f, за которым следует AABB.xxd может использоваться для проверки выходных данных:

bashpromt$ printf %10s AABB | tr ' ' $'\x1f' | xxd
00000000: 1f1f 1f1f 1f1f 4141 4242                 ......AABB

Поскольку bash не может обработать нулевой байт, вам необходим немного другой синтаксис для заполнения с помощью \x00:

bashpromt$ printf %10s AABB | tr ' ' '\0' | xxd
00000000: 0000 0000 0000 4141 4242                 ......AABB
0 голосов
/ 30 мая 2018

Решения с использованием циклов:

str=AABB
while ((${#str} < 10)); do 
  str+='X'
done
echo $str
str=AABB
for ((i=${#str};i<10;++i)); do 
  str+='X'
done
echo $str

Однако вы не можете добавить нулевой байт в строку в bash.Мой bash выдает предупреждение:

bash: warning: command substitution: ignored null byte in input

В этом случае нам нужно работать с файлами, возможно, так:

echo -n AABB >/tmp/1
while (($(wc -c </tmp/1) < 10)); do 
   echo -ne '\x00' >> /tmp/1
done
cat /tmp/1 | hexdump -C
00000000  41 41 42 42 00 00 00 00  00 00                    |AABB......|
0000000a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...