提取两行之间的文本
Extract text between two lines
我正在构建一个 bash
-脚本,以使用 figlist
.
可视化可用于 figlet
的各种字体
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 commands/builtins 中的解决方案,因为这是我编写脚本所使用的语言,但如果可以通过 python 获得它-班轮或类似的东西(例如python -c <some command>
)那么这也是可以接受的。
更新:
更短且 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
Python 单行:
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
就这些了,伙计们
由于这个问题也被标记为 awk,我可以随意添加一个 awk 解决方案:
/^Figlet fonts/ { on = 1 ; next }
/^Figlet control/ { on = 0 ; next }
on { print [=10=] }
测试(在 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 [=11=] }'
3-d
3x5
5lineoblique
[...]
twopoint
univers
usaflag
weird
whimsy
$
我正在构建一个 bash
-脚本,以使用 figlist
.
figlet
的各种字体
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 commands/builtins 中的解决方案,因为这是我编写脚本所使用的语言,但如果可以通过 python 获得它-班轮或类似的东西(例如python -c <some command>
)那么这也是可以接受的。
更新:
更短且 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
Python 单行:
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
就这些了,伙计们
由于这个问题也被标记为 awk,我可以随意添加一个 awk 解决方案:
/^Figlet fonts/ { on = 1 ; next }
/^Figlet control/ { on = 0 ; next }
on { print [=10=] }
测试(在 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 [=11=] }'
3-d
3x5
5lineoblique
[...]
twopoint
univers
usaflag
weird
whimsy
$