มีหลายวิธีในการทำเช่นนี้ สองแบบพกพาที่สุดที่ฉันรู้sed
และเป็นod
- ทั้งสอง POSIX
printf '\n\r\b\t\033[01;31m' | sed -n l
มันไม่เหมือน ... read
สไตล์การหลบหนี - สไตล์ C
เอาท์พุท
$
\r\b\t\033[01;31m$
od
สามารถกำหนดค่าได้มากกว่านี้เล็กน้อย ...
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
หากคุณต้องการทราบว่าคุณสามารถดูตัวเลือกเหล่านี้ได้ทั้งหมดman od
แต่ฉันระบุว่าฉันต้องการ Escape สองประเภท - -t c
Backslash Escape และ-t a
อักขระที่มีชื่อ -w
ตัวเลือกที่ใช้ข้างต้นไม่ POSIX ระบุ
และนี่คือฟังก์ชั่นเชลล์ตัวเล็ก ๆ ที่จะพิมพ์ค่าฐานแปดของแต่ละไบต์ในอาร์กิวเมนต์ของมันซึ่งแน่นอนว่าod
อาจรองรับเช่นกันกับ-t o
:
proctal() (LC_ALL=C
for a do while [ -n "$a" ]
do printf %o\\n "'$a"
a=${a#?}; done; done)
นั่นเป็นเรื่องง่าย มันซับซ้อนกว่านี้เล็กน้อย มันควรจะสามารถทำสิ่งที่การprintf -q
ใช้งานเฉพาะเชลล์สามารถทำได้
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/$$//'
)
การใช้สตริงตัวอย่างออกจากก่อนหน้านี้กับเพิ่มเติมเล็กน้อย:
bsq "$(printf '\n\r\'\''b\t\033[01;31m')"
เอาท์พุท
'\n\r\\'\''b\t\0033[01;31m'
มันแตกต่างกันเล็กน้อยเท่านั้น คุณอาจสังเกตเห็นว่ามีackslash พิเศษ0
และพิเศษ \b
นี่คือเพื่อให้ง่ายสำหรับการแปลread
เป็น%b
printf
อาร์กิวเมนต์หรือ ตัวอย่างเช่น:
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
เอาท์พุท
<\%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 >$