Python 提取两行之间的文本

Python 提取两行之间的文本,python,bash,awk,sed,figlet,Python,Bash,Awk,Sed,Figlet,我正在构建一个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 Figle

我正在构建一个
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)
/^Figlet fonts/ { on = 1 ; next }
/^Figlet control/ { on = 0 ; next }
on { print $0 }

read-a字体更新:

较短且
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

更新:

较短且
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一行程序:

输出:

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

各位,就这些了,Python一行:

输出:

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


就这些,各位

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

read -a fonts <<<$(figlist | tail -n +4 | head -n 163)
/^Figlet fonts/ { on = 1 ; next }
/^Figlet control/ { on = 0 ; next }
on { print $0 }
测试(在bash、cygwin和Windows 10上):


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

read -a fonts <<<$(figlist | tail -n +4 | head -n 163)
/^Figlet fonts/ { on = 1 ; next }
/^Figlet control/ { on = 0 ; next }
on { print $0 }
测试(在bash、cygwin和Windows 10上):


谢谢你的快速回复。我得到了
sed:1:“/Figlet-fonts/,/Figlet/…”:在bash-interactivelyLooks中,p命令的末尾有额外的字符。添加一个
p
之后。编辑了答案中的代码。@EdMorton我同意基于您提到的原因,
awk
解决方案更可取。我从来不知道,当一行中的最后一个符号是管道时,bash中的命令可以扩展到多行。我仍然喜欢在管线的开始处对齐管道。在我看来,这更容易阅读。(看起来很不错;))这绝对是一件见仁见智的事情——我更喜欢在行尾的管道外观(如果有意义的话对齐),以及在行首对齐管道中涉及的命令。IMHO使每一行本身更清晰,因为您可以在每一行上单独看到它的输出将进入管道(vs重定向到文件或任何可能跟随反斜杠的内容)。本质上,这意味着你不需要阅读下一行就可以完全了解当前行正在做什么。它可以节省几个字符,并且不会影响正常的缩进!nbd虽然…@EdMorton重复的条件是可以避免的:
sed-n'/^Figlet font/,/^Figlet/{/!p;}'
。感谢您的快速回复。我得到了
sed:1:“/Figlet-fonts/,/Figlet/…”:在bash-interactivelyLooks中,p命令的末尾有额外的字符。添加一个
p
之后。编辑了答案中的代码。@EdMorton我同意基于您提到的原因,
awk
解决方案更可取。我从来不知道,当一行中的最后一个符号是管道时,bash中的命令可以扩展到多行。我仍然喜欢在管线的开始处对齐管道。在我看来,这更容易阅读。(看起来很不错;))这绝对是一件见仁见智的事情——我更喜欢在行尾的管道外观(如果有意义的话对齐),以及在行首对齐管道中涉及的命令。IMHO使每一行本身更清晰,因为您可以在每一行上单独看到它的输出将进入管道(vs重定向到文件或任何可能跟随反斜杠的内容)。本质上,这意味着你不需要阅读下一行就可以完全了解当前行正在做什么。它可以节省几个字符,并且不会影响正常的缩进!nbd虽然…@EdMorton重复的条件是可以避免的:
sed-n'/^Figlet font/,/^Figlet/{/!p;}'
。谢谢分享,先生,你太棒了。你的解决方案太好了:)(1)一行代码是可以放在一行中的代码,不是应该放在多行中的代码,而是你把它放在一行中的代码。(2) 在Python中使用正则表达式是不正确的。使用
String.startswith()
检查一个字符串是否以另一个固定字符串开头。@hek2mgl,他通过python一行程序询问,我给了他一行程序。没有你的建议,我知道str.startwith()和regex。因此,我不需要你的帮助,虽然我倾向于同意@hek2mgl对一行的解释,但这是一个有效的解决方案,如果由于长度原因难以表达的话+1是一个很好的解决方案,但我更喜欢
awk
。谢谢分享,先生,你太棒了。你的解决方案太好了:)(1)一行代码是可以放在一行中的代码,不是应该放在多行中的代码,而是你把它放在一行中的代码。(2) 在Python中使用正则表达式是不正确的。使用
String.startswith()
检查一个字符串是否以另一个固定字符串开头。@hek2mgl,他通过python一行程序询问,我给了他一行程序。没有你的建议,我知道str.startwith()和regex。因此,我不需要你的帮助,虽然我倾向于同意@hek2mgl对一行的解释,但这是一个有效的解决方案,如果由于长度原因难以表达的话+1是一个好的解决方案,但我更喜欢
awk