16進行をバイナリに変換しようとしていますが、bash
出力にバックスラッシュが含まれています。誰かが理由を説明できますか?
入力する:
for i in 3D3D516343746D4D6D6C315669563362; do BIN=$(echo "ibase=16; obase=2; $i" | bc); echo $BIN; done
出力:
11110100111101010100010110001101000011011101000110110101001101011011\ 0101101100001100010101011001101001010101100011001101100010
答え1
POSIX実装はbc
バックスラッシュを使用して出力行を最大70文字に分割します。行連続文字。
GNUバージョンがある場合は、bc
環境変数を使用してこの動作をオーバーライドできますBC_LINE_LENGTH
。
$ printf 'ibase=16; obase=2; %s\n' 3D3D516343746D4D6D6C315669563362 | BC_LINE_LENGTH=0 bc
111101001111010101000101100011010000110111010001101101010011010110110101101100001100010101011001101001010101100011001101100010
からinfo bc
:
'BC_LINE_LENGTH'
This should be an integer specifying the number of characters in an
output line for numbers. This includes the backslash and newline
characters for long numbers. As an extension, the value of zero
disables the multi-line feature. Any other value of this variable
that is less than 3 sets the line length to 70.
答え2
一部の「bashism」を使用して出力をフィルタリングできます。echo ${BIN//[$'\r\n\\']}
例:
for i in 3D3D516343746D4D6D6C315669563362; do BIN=$(echo "ibase=16; obase=2; $i" | bc); echo ${BIN//[$'\r\n\\']};done
BC_LINE_LENGTH
GNU bcが行の長さを調整するために使用するenv変数を使用することもできます(0は無限大です)。
例:
for i in 3D3D516343746D4D6D6C315669563362; do BIN=$(echo "ibase=16; obase=2; $i" | BC_LINE_LENGTH=0 bc ); echo $BIN;done
答え3
もし牛に似た一種の栄養 bc
使用できません。以下でも動作します。
echo "ibase=16; obase=2; 3D3D516343746D4D6D6C315669563362" | \
bc | tr -d '\\\n' ; echo
111101001111010101000101100011010000110111010001101101010011010110110101101100001100010101011001101001010101100011001101100010
(意図的に長すぎる出力をラップしません。)