pythonbashawksedfiglet

Extract text between two lines


I am building a bash-script to visualize the various fonts available for figlet using figlist.

figlist provides output like this:

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

The [...]s represent snipped output. My desired output is the following:

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

That is, I want the font names. I cannot guarantee the output format, but I don't want any control files, and I don't want the informational lines. I'm not sure, but I suspect all fonts must have one word names, so a regex solution might be possible. However, the control files have a similar format.

Current (hard-coded) solution:

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

This provides what I want, but requires that the length of the font list never changes, which I don't want.

I would prefer a solution in bash/standard commands/builtins, as that is the language in which I am writing the script, but if it can be obtained via a python one-liner or something similar (e.g. python -c <some command>) then that is acceptable as well.


Solution

  • Update:

    A shorter and preferable awk alternative would be:

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

    I recommend to use in favour of the below sed command.


    Original answer:

    You can use sed:

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

    Example:

    Print the current user name with each installed figlet font:

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