在Bash中用一个选定的字符(或十六进制代码)将字符串填充到一定长度?

时间:2018-05-30 11:58:07

标签: linux bash shell

我想用Bash将一个字符串填充到一定长度的任何字符(或十六进制代码)。

假设我有字符串AABB并希望使用X或(0x00)将其填充到长度10:

AABBXXXXXX

我知道如何使用printf填充空格。如何填充任意字符(或十六进制代码)?

2 个答案:

答案 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,后跟AABBxxd可用于验证输出:

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