在两行

时间:2017-07-22 21:05:24

标签: python bash awk sed figlet

我正在构建一个bash脚本,以使用figlet可视化figlist可用的各种字体。

figlist提供如下输出:

Default font: standard
Font directory: /usr/local/Cellar/figlet/2.2.5/share/figlet/fonts
Figlet fonts in this directory:
3-d
3x5
5lineoblique
[...]
twopoint
univers
usaflag
weird
whimsy
Figlet control files in this directory:
646-ca
646-ca2
646-cn
646-cu
[...]
tsalagi
upper
ushebrew
uskata
utf8

[...]代表剪切输出。我想要的输出如下:

3-d
3x5
5lineoblique
[...]
twopoint
univers
usaflag
weird
whimsy

也就是说,我想要字体名称。我无法保证输出格式,但我不想要任何控制文件,而且我不想要信息行。我不确定,但我怀疑所有字体必须有一个单词名称,因此可能有正则表达式解决方案。但是,控制文件的格式类似。

当前(硬编码)解决方案:

read -a fonts <<<$(figlist | tail -n +4 | head -n 163)

这提供了我想要的,但要求字体列表的长度永远不会改变,我

我更喜欢bash / standard命令/ builtins中的解决方案,因为这是我编写脚本的语言,但是如果它可以通过python单行或类似的东西获得(例如{{1}那么这也是可以接受的。

3 个答案:

答案 0 :(得分:2)

Python one-liner

figlist | python -c "import sys,re; fonts=re.search(r'Figlet fonts.+?:(.*)(?=Figlet control)',sys.stdin.read(), re.DOTALL); print(fonts.group(1).strip())"

输出:

3-d
3x5
5lineoblique
[...]
twopoint
univers
usaflag
weird
whimsy

这就是全部,伙计们

答案 1 :(得分:1)

<强>更新

较短的preferable awk替代方案是:

figlist | awk '/Figlet/{p=!p;next}p'

我建议使用以下sed命令。

原始回答:

您可以使用sed

figlist | sed -n '/Figlet fonts/,/Figlet/{//!p;}'

示例:

使用每个已安装的figlet字体打印当前用户名:

figlist \
  | sed -n '/Figlet fonts/,/Figlet/{//!p;}' \
  | while read -r font ; do
        echo "font: ${font}"
        figlet -f"${font}" "$(whoami)"
    done

答案 2 :(得分:1)

由于这个问题也被标记为,我随意添加一个awk解决方案:

/^Figlet fonts/ { on = 1 ; next }
/^Figlet control/ { on = 0 ; next }
on { print $0 }

测试(在bash,cygwin,Windows 10上):

$ echo 'Default font: standard
> Font directory: /usr/local/Cellar/figlet/2.2.5/share/figlet/fonts
> Figlet fonts in this directory:
> 3-d
> 3x5
> 5lineoblique
> [...]
> twopoint
> univers
> usaflag
> weird
> whimsy
> Figlet control files in this directory:
> 646-ca
> 646-ca2
> 646-cn
> 646-cu
> [...]
> tsalagi
> upper
> ushebrew
> uskata
> utf8
> ' | awk '/^Figlet fonts/ { on = 1 ; next } /^Figlet control/ { on = 0 ; next } on { print $0 }'
3-d
3x5
5lineoblique
[...]
twopoint
univers
usaflag
weird
whimsy

$