如何获得类似于 linux 命令“tree”输出的 ASCII 字符?

Tom*_* Iv 5 bash tree

有没有办法打印 ASCII 字符 '??? ' 和 '???' 使用 bash 或 perl 脚本?我希望它与“树”的输出完全一样。

[root@localhost www]# tree -L 1
.
??? cgi-bin
??? error
??? html
??? icons
Run Code Online (Sandbox Code Playgroud)

Rot*_*ots 5

它们看起来是扩展 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)


F. *_*uri 5

中使用 Unicode 特定字符

\n

这里有 3-4 个不同的答案,一些提示和示例......

\n

1.使用特殊字符直接写入UTF8 脚本。

\n
HorizT=\'\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

2. 从输出样本中查找字符值

\n

正如您所说的tree输出示例,您可以运行类似的东西

\n
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.

\n

所以你可以尝试:

\n
printf "\\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

2.b 与纯 bash相同:

\n

如果您尝试将其剪切\n粘贴到终端中:

\n
declare -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

你必须看到:

\n
Char: \'\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
    \n
  • 运行此命令时,当前目录必须至少有 1 个子目录(不为空),才能显示完整的输出。
  • \n
  • 执行时间将取决于树的大小!(您可能需要等待最后一个\'\xe2\x94\x94\';-)。
  • \n
\n

3. 使用以下命令搜索特定字符charmap

\n

您可以使用专用的 Unicode 浏览器,例如在Debian Gnome GNU/Linuxcharmap下:

\n

GNOME 字符映射表

\n

浏览并找到您的角色,然后在第二个选项卡上Character Details::

\n

魅力图细节

\n

您可以阅读各种有用的 -> 八进制转义表示

\n
printf \'\\342\\224\\234\\n\'\n\xe2\x94\x9c\n
Run Code Online (Sandbox Code Playgroud)\n

3+。使用打印 Unicode 字体printf

\n

一旦你知道了unicode 值,你就可以用来printf创建变量:

\n
printf -v char \'\\U251C\'\necho $char\n\xe2\x94\x9c\n
Run Code Online (Sandbox Code Playgroud)\n

从这里开始,经过一番头脑风暴:

\n
string=\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

或者

\n
string=\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)\n

4. 最终bash功能

\n

严格回答SO请求:

\n
\n

我希望它的输出与“tree”的输出完全相同。

\n
\n

这是一个函数:

\n
tree-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

那么你可以尝试比较一下:

\n
diff <(tree-L1 /etc) <(tree -L 1 /etc)\n
Run Code Online (Sandbox Code Playgroud)\n

可能什么也不输出,因为常规输出和我的函数的输出之间没有区别!或者tree -L 1

\n
diff --width 80 -y <(tree-L1 /etc) <(tree -L 1 /etc)\n
Run Code Online (Sandbox Code Playgroud)\n

5. 按字符名称浏览Unicode表

\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)\n

5+ 从输出中提取特殊字符tree,并带有完整描述

\n

使用之前的脚本,首先创建一个 关联数组 u8Table

\n
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

然后

\n
declare -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)\n
Char: \'\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)