Có rất nhiều cách để làm điều này. Hai thiết bị di động nhất mà tôi biết là sed
và od
- cả hai đều là POSIX.
printf '\n\r\b\t\033[01;31m' | sed -n l
Nó không thích ... read
thoát kiểu - kiểu C.
ĐẦU RA
$
\r\b\t\033[01;31m$
od
cấu hình hơn một chút ...
printf '\n\r\b\t\033[01;31m' |
od -v -w12 -t c -t a -A n
\n \r \b \t 033 [ 0 1 ; 3 1 m
nl cr bs ht esc [ 0 1 ; 3 1 m
Nếu bạn muốn biết tất cả các tùy chọn đó bạn có thể xem trong đó man od
, nhưng tôi chỉ định tôi muốn có hai loại thoát - -t c
dấu gạch chéo ngược thoát và -t a
ký tự được đặt tên. Các -w
tùy chọn sử dụng trên không phải là POSIX chỉ định.
Và đây là một hàm shell nhỏ có thể in ra các giá trị bát phân của từng byte trong các đối số của nó - tất nhiên, od
có thể xử lý tốt như -t o
sau:
proctal() (LC_ALL=C
for a do while [ -n "$a" ]
do printf %o\\n "'$a"
a=${a#?}; done; done)
Đó là một điều đơn giản. Điều này phức tạp hơn một chút. Nó sẽ có thể làm những gì các printf -q
triển khai cụ thể vỏ có thể, mặc dù.
bsq() (set -f; export LC_ALL=C IFS=\'
for a do q=${a##*\'}; printf \'
[ -n "${a#"$q"}" ] &&
printf "%s'\''" ${a%\'*}
printf "%s'\n'''''\n" "$q"; done |
sed -n "/'''''"'/!H;1h;//!d;$!n;x;l' |
sed -e :n -e '/\\$/N;s/.\n//;tn
s/\([^\\]\\\(\\\\\)*\)\([0-9]\)/\10\3/g
s/\\\\'"''/\\\\''"'/g;s/$$//'
)
Sử dụng chuỗi ví dụ từ trước đó với một chút bổ sung:
bsq "$(printf '\n\r\'\''b\t\033[01;31m')"
ĐẦU RA
'\n\r\\'\''b\t\0033[01;31m'
Nó chỉ hơi khác một chút. Bạn có thể nhận thấy có thêm 0
một \b
ackslash. Điều này là để cho phép dễ dàng dịch sang một read
hoặc một %b
printf
đối số. Ví dụ:
i=0
until [ $((i=$i+1)) -gt 5 ]
do touch "\%$i$(printf 'hey\b \t;\n\033 ')"
done #just for ugly's sake
bsq * | eval "
printf '<%b>\n' $(tr \\n \ )
" | tee /dev/fd/2 |
sed -n l
ĐẦU RA
<\%1he ;
>
<\%2he ;
>
<\%3he ;
>
<\%4he ;
>
<\%5he ;
>
<\\%1hey\b \t;$
\033 >$
<\\%2hey\b \t;$
\033 >$
<\\%3hey\b \t;$
\033 >$
<\\%4hey\b \t;$
\033 >$
<\\%5hey\b \t;$
\033 >$