问题
有没有办法将回车符转换为字符串中的实际覆盖,以便000000000000\r1010
变换为101000000000
?
Context
1. 初步目标:
有号码x
(0到255之间)在基数10中,我想将这个数字转换为基数2,添加尾随零以获得12位长的二进制表示,生成12个不同的数字(每个数字都由最后一个数字组成)n
以 2 为基数的数字,其中n
1 到 12 之间)并打印这 12 个数字的以 10 为基数的表示形式。
2. 示例:
- With
x = 10
- 基数 2 是
1010
- 带有尾随零
101000000000
- 提取 12 个“前导”数字:
1
, 10
, 101
, 1010
, 10100
, 101000
, ...
- 转换为基数 10:
1
, 2
, 5
, 10
, 20
, 40
, ...
3.我做了什么(不起作用):
x=10
x_base2="$(echo "obase=2;ibase=10;${x}" | bc)"
x_base2_padded="$(printf '%012d\r%s' 0 "${x_base2}")"
for i in {1..12}
do
t=$(echo ${x_base2_padded:0:${i}})
echo "obase=10;ibase=2;${t}" | bc
done
4. 为什么不起作用
因为变量x_base2_padded
包含整个序列000000000000\r1010
。这可以通过使用来确认hexdump
例如。在 for 循环中,当我提取前 12 个字符时,我只得到零。
5.替代方案
我知道我可以通过向变量添加零来找到替代方案,如下所示:
x_base2=1010
x_base2_padded="$(printf '%s%0.*d' "${x_base2}" $((12-${#x_base2})) 0)"
或者通过使用零填充printf
and rev
x_base2=1010
x_base2_padded="$(printf '%012s' "$(printf "${x_base2}" | rev)" | rev)"
虽然这些替代方案现在解决了我的问题并让我继续我的工作,但它并没有真正回答我的问题。
相关问题
在不同的环境中可能会观察到相同的问题。例如,如果尝试连接多个包含回车符的字符串。结果可能很难预测。
str=$'bar\rfoo'
echo "${str}"
echo "${str}${str}"
echo "${str}${str}${str}"
echo "${str}${str}${str}${str}"
echo "${str}${str}${str}${str}${str}"
首先echo
将输出foo
。尽管您可能期望其他echo
输出foofoofoo...
,他们都输出foobar
.