我想用Bash将一个字符串填充到一定长度的任何字符(或十六进制代码)。
假设我有字符串AABB
并希望使用X
或(0x00
)将其填充到长度10:
AABBXXXXXX
我知道如何使用printf
填充空格。如何填充任意字符(或十六进制代码)?
答案 0 :(得分:1)
使用循环的解决方案:
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
答案 1 :(得分:1)
使用printf
填充空格,然后用您选择的符号替换空格。一些例子:
printf %-10s AABB | tr ' ' X
打印AABBXXXXXX
printf %10s AABB | tr ' ' X
打印XXXXXXAABB
。
当然,这只适用于您的字符串不包含任何空格的情况。
要按十六进制代码插入不可打印的符号,请使用bash&#39; s c string $'...'
。
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