有没有办法打印 ASCII 字符 '??? ' 和 '???' 使用 bash 或 perl 脚本?我希望它与“树”的输出完全一样。
[root@localhost www]# tree -L 1
.
??? cgi-bin
??? error
??? html
??? icons
Run Code Online (Sandbox Code Playgroud)
它们看起来是扩展 ascii 代码的一部分。你可以在这里看到它们http://www.asciitable.com/
也可以在此处的 Unicode 表中找到:http://unicode-table.com/en/sections/box-drawing/
我相信192、195和196就是你想要的。采用 Unicode 2501、2514 和 2523。
编辑
在这里找到了一个相关的堆栈问题,建议以 Unicode 打印。
你想要的是能够打印 unicode,答案就在
perldoc perluniintro
. 您可以使用\x{nnnn}
其中 n 是十六进制标识符,也可以使用\N{...}
名称:
perl -E 'say "\x{2514}"; use charnames; say "\N{BOX DRAWINGS LIGHT UP AND RIGHT}"'
Run Code Online (Sandbox Code Playgroud)
这里有 3-4 个不同的答案,一些提示和示例......
\nHorizT=\'\xe2\x94\x9c\'\nHLine=\'\xe2\x94\x80\'\necho $HorizT$HLine$HLine\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\n
Run Code Online (Sandbox Code Playgroud)\n正如您所说的tree
输出示例,您可以运行类似的东西
tree / | sed -ne \'2{p;q}\'\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bin\n\ntree / | sed -ne \'2{p;q}\' | od -An -t o1\n342 224 234 342 224 200 342 224 200 040 142 151 156 012\n
Run Code Online (Sandbox Code Playgroud)\n将您的引用输出为八进制值。
\n知道Unicode使用可变的字节数,您的参考字符串包含 3 个 unicode 字符,看起来像 3 组 3 个值,以342
.
所以你可以尝试:
\nprintf "\\342\\224\\234\\n"\n\xe2\x94\x9c\n\nprintf -v HorizontalT "\\342\\224\\234"\nprintf -v Hline "\\342\\224\\200"\n\necho $HorizontalT$Hline$Hline$Hline\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n
Run Code Online (Sandbox Code Playgroud)\n如果您尝试将其剪切\n粘贴到终端中:
\ndeclare -A shown=\'()\' # Array list of already shown characters.\nwhile IFS= read -r line; do # For each line in tree output,\n for ((i=0; i<${#line}; i++)); do # For each character in each line,\n [[ ${line:i:1} == \\ ]] && break # Stop reading line at 1st space!\n if ! [[ -v shown["${line:i:1}"] ]]; then # If not already shown,\n LANG=C printf -v char %q "${line:i:1}" # Store C printable in $char,\n [[ ${char#\\\\} == "${line:i:1}" ]] || # If printable != character,\n printf \'Char: \\47%s\\47 => %s\\n\' "${line:i:1}" "$char" # print,\n shown["${line:i:1}"]=yes # Add character to shown array list.\n fi\n done # Line done,\ndone < <(tree ) # Done! All this are taking input from tree command\'s output. \n
Run Code Online (Sandbox Code Playgroud)\n你必须看到:
\nChar: \'\xe2\x94\x9c\' => $\'\\342\\224\\234\'\nChar: \'\xe2\x94\x80\' => $\'\\342\\224\\200\'\nChar: \'\xe2\x94\x82\' => $\'\\342\\224\\202\'\nChar: \'\xc2\xa0\' => $\'\\302\\240\'\nChar: \'\xe2\x94\x94\' => $\'\\342\\224\\224\'\n
Run Code Online (Sandbox Code Playgroud)\n笔记:
\n\'\xe2\x94\x94\'
;-)。charmap
您可以使用专用的 Unicode 浏览器,例如在Debian Gnome GNU/Linuxcharmap
下:
浏览并找到您的角色,然后在第二个选项卡上Character Details
::
您可以阅读各种有用的 ->
八进制转义表示:
printf \'\\342\\224\\234\\n\'\n\xe2\x94\x9c\n
Run Code Online (Sandbox Code Playgroud)\nprintf
一旦你知道了unicode 值,你就可以用来printf
创建变量:
printf -v char \'\\U251C\'\necho $char\n\xe2\x94\x9c\n
Run Code Online (Sandbox Code Playgroud)\n从这里开始,经过一番头脑风暴:
\nstring=\nfor i in 0 2 16 24 {12..60..8} ;do\n printf -v r \'\\\\U25%02X\' $i\n printf -v char "$r"\n string+="$char "\ndone\necho "$string"\n\xe2\x94\x80 \xe2\x94\x82 \xe2\x94\x90 \xe2\x94\x98 \xe2\x94\x8c \xe2\x94\x94 \xe2\x94\x9c \xe2\x94\xa4 \xe2\x94\xac \xe2\x94\xb4 \xe2\x94\xbc \n
Run Code Online (Sandbox Code Playgroud)\n或者
\nstring=\nfor i in {80..108} ;do\n printf -v r \'\\\\U25%02X\' $i\n printf -v char "$r"\n string+="$char "\ndone\necho "$string"\n\xe2\x95\x90 \xe2\x95\x91 \xe2\x95\x92 \xe2\x95\x93 \xe2\x95\x94 \xe2\x95\x95 \xe2\x95\x96 \xe2\x95\x97 \xe2\x95\x98 \xe2\x95\x99 \xe2\x95\x9a \xe2\x95\x9b \xe2\x95\x9c \xe2\x95\x9d \xe2\x95\x9e \xe2\x95\x9f \xe2\x95\xa0 \xe2\x95\xa1 \xe2\x95\xa2 \xe2\x95\xa3 \xe2\x95\xa4 \xe2\x95\xa5 \xe2\x95\xa6 \xe2\x95\xa7 \xe2\x95\xa8 \xe2\x95\xa9 \xe2\x95\xaa \xe2\x95\xab \xe2\x95\xac \n
Run Code Online (Sandbox Code Playgroud)\nbash
功能严格回答SO请求:
\n\n\n我希望它的输出与“tree”的输出完全相同。
\n
这是一个函数:
\ntree-L1() { \n local _i indent=0 entry root=${1:-.};\n local -i dirs files;\n [[ $1 == -i ]] && indent=$2 && shift 2;\n echo "$root";\n . <(cd "$root";set -- *;echo ${@@A});\n printf -v indent \'%*s\' "$indent" \'\';\n for ((_i=1; _i<=$#; _i++))\n do\n entry=${!_i};\n [[ -d $root/$entry ]] && dirs+=1 || files+=1;\n [[ -L $root/$entry ]] && printf -v entry \'%s -> %s\' "${!_i}" "$(\n readlink "$root/${!_i}")";\n if ((_i==$#)); then\n printf \'%b%b%b%b %s\\n\' "${indent// /\\\\U2502 }" \\\n \\\\U2514 \\\\U2500{,} "$entry";\n else\n printf \'%b%b%b%b %s\\n\' "${indent// /\\\\U2502 }" \\\n \\\\U251C \\\\U2500{,} "$entry";\n fi;\n done;\n printf \'\\n%d directories, %d files\\n\' $dirs $files\n}\n
Run Code Online (Sandbox Code Playgroud)\n那么你可以尝试比较一下:
\ndiff <(tree-L1 /etc) <(tree -L 1 /etc)\n
Run Code Online (Sandbox Code Playgroud)\n可能什么也不输出,因为常规输出和我的函数的输出之间没有区别!或者tree -L 1
diff --width 80 -y <(tree-L1 /etc) <(tree -L 1 /etc)\n
Run Code Online (Sandbox Code Playgroud)\n请查看是否有(linux)终端字符选择器?在 SuperUser 上,我发布了一个小的 Python unicode 库:
\n./dumpUnicode | grep \'BOX DRAWINGS LIGHT.*\\(HORI\\|VERT\\)\'\n
Run Code Online (Sandbox Code Playgroud)\n\\U002500: \'\xe2\x94\x80\' BOX DRAWINGS LIGHT HORIZONTAL\n\\U002502: \'\xe2\x94\x82\' BOX DRAWINGS LIGHT VERTICAL\n\\U002504: \'\xe2\x94\x84\' BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL\n\\U002506: \'\xe2\x94\x86\' BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL\n\\U002508: \'\xe2\x94\x88\' BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL\n\\U00250A: \'\xe2\x94\x8a\' BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL\n\\U00251C: \'\xe2\x94\x9c\' BOX DRAWINGS LIGHT VERTICAL AND RIGHT\n\\U002524: \'\xe2\x94\xa4\' BOX DRAWINGS LIGHT VERTICAL AND LEFT\n\\U00252C: \'\xe2\x94\xac\' BOX DRAWINGS LIGHT DOWN AND HORIZONTAL\n\\U002534: \'\xe2\x94\xb4\' BOX DRAWINGS LIGHT UP AND HORIZONTAL\n\\U00253C: \'\xe2\x94\xbc\' BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL\n\\U00254C: \'\xe2\x95\x8c\' BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL\n\\U00254E: \'\xe2\x95\x8e\' BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL\n\\U01FBAF: \'\' BOX DRAWINGS LIGHT HORIZONTAL WITH VERTICAL STROKE\n
Run Code Online (Sandbox Code Playgroud)\ntree
,并带有完整描述使用之前的脚本,首先创建一个bash 关联数组 u8Table
:
declare -A u8Table=\'()\'\nwhile IFS=\\ read -r cod char dsc; do\n char="${char#\\\'}" char="${char%\\\'}"\n u8Table["$char"]="$cod $dsc"\ndone < <(dumpUnicode | grep -v \'^.U0000[2-7]\')\n
Run Code Online (Sandbox Code Playgroud)\n然后
\ndeclare -A shown=\'()\'\nwhile IFS= read -r line; do\n for ((i=0; i<${#line}; i++)); do\n [[ ${line:i:1} == \\ ]] && break\n if ! [[ -v shown["${line:i:1}"] ]]; then\n LANG=C printf -v char %q "${line:i:1}"\n [[ ${char#\\\\} == "${line:i:1}" ]] ||\n printf \'Char: \\47%s\\47 => %-16s %s\\n\' \\\n "${line:i:1}" "$char" "${u8Table["${line:i:1}"]}"\n shown["${line:i:1}"]=yes\n fi\n done\ndone < <(tree)\n
Run Code Online (Sandbox Code Playgroud)\nChar: \'\xe2\x94\x9c\' => $\'\\342\\224\\234\' \\U00251C: BOX DRAWINGS LIGHT VERTICAL AND RIGHT\nChar: \'\xe2\x94\x80\' => $\'\\342\\224\\200\' \\U002500: BOX DRAWINGS LIGHT HORIZONTAL\nChar: \'\xe2\x94\x82\' => $\'\\342\\224\\202\' \\U002502: BOX DRAWINGS LIGHT VERTICAL\nChar: \'\xc2\xa0\' => $\'\\302\\240\' \\U0000A0: NO-BREAK SPACE\nChar: \'\xe2\x94\x94\' => $\'\\342\\224\\224\' \\U002514: BOX DRAWINGS LIGHT UP AND RIGHT\n
Run Code Online (Sandbox Code Playgroud)\n
小智 4
echo -e "\0342\0224\0224\0342\0224\0200\0342\0224\0200 \033[01"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3254 次 |
最近记录: |