是否可以在cowsay/cowthink的输出中注入换行符,同时保留“泡沫”?

是否可以在cowsay/cowthink的输出中注入换行符,同时保留“泡沫”?

我保留一个打印该手册的版本Bash很方便,所以我很好奇对其所做的任何更改 - 特别是因为我并不总是关注我更新的软件包。通常在本地你有与你所拥有的软件版本相关的手册版本,并且你可以跟踪变化容易地。

我构建这个是为了检查一些来源并进行总结:

#!/usr/bin/env bash
## bashmancheck - Check different sources for date of the last updates

header="BASH manual -- Local BASH manual -- BASH repo /doc -- BASH Reference man(www)"
data="$(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/tree/doc/bash.1' | grep -om 1 'Last Change.*' | cut -d ' ' -f 4,6,9) -- $(zcat /usr/share/man/man1/bash.1.gz | grep -om 1 'Last Change.*' | cut -d ' ' -f 4,6,9) -- $(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/log/doc' | grep -Eom 1 '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}') -- $(links -dump 'http://www.gnu.org/software/bash/manual' | grep -om 1 'last updated.*' | cut -d ' ' -f 3-)"

cowthink -W80 -f bud-frogs --  $header $data

它使用linkszcat来查看在线和本地手册页源中的特定字符串,以及 Bash 存储库的 /doc 部分,最后是在线参考手册中的特定字符串。输出如下所示:

( BASH manual -- Local BASH manual -- BASH repo /doc -- BASH Reference man(www) )
( Feb 2 2014 -- Feb 2 2014 -- 2014-02-26 -- August 22, 2012                     )
 ------------------------------------------------------------------------------- 
     o
      o
          oO)-.                       .-(Oo
         /__  _\                     /_  __\
         \  \(  |     ()~()         |  )/  /
          \__|\ |    (-___-)        | /|__/
          '  '--'    ==`-'==        '--'  '

但我希望我有成对的项目和日期,每个都在一行上,如下所示:

BASH manual: Feb 2 2014
Local BASH manual: Feb 2 2014
BASH repo /doc: 2014-02-26
BASH Reference man(www): August 22, 2012

但为此,我需要在连接项目及其日期后更改行 - 而且我无法实现它cowsay/cowthink。这解释了为什么我这样设计脚本。这两个变量只是帮助我格式化,但在执行时没有影响。碰巧的是,标题和数据变量的宽度都小于 80 列,并且为此目的将命令输出设置为 80 列。我还曾经cut缩短它们在一行上显示的日期,而不是grep -o像我最初那样使用。我随意使用一些字符(双破折号)进行格式化 - 这很粗糙。

你可以使用换行符吗考赛?有一个更好的方法吗?

答案1

为了制作漂亮的气泡,cowsay 默认会修剪所有空白。这意味着换行。如果连续传递两个换行符,cowsay 会打印这两个换行符。

尝试

cowsay "lala
lala"

cowsay "lala

lala"

第一个会lala lala在气泡中输出,后者会输出

lala

lala

这不是与 shell 相关的行为,这只是owsay :)

如果您不喜欢这样,则需要切换-n。它完全防止自动换行,因此允许任意空白字符。

不幸的是,以下命令无法正常工作:

cowsay -n "lala
lala"

因为在我的版本中,cowsay 不允许在-n给出选项时将消息作为参数传递。但

echo "lala
lala" | cowsay -n

起到了魅力的作用。

因此,对于您的问题,如果您不喜欢输出中的双 \n,请将命令更改为

(echo "BASH manual - $(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/tree/doc/bash.1' | grep -om 1 'Last Change.*')"; echo "Local BASH manual - $(zcat /usr/share/man/man1/bash.1.gz | grep -om 1 'Last Change.*')"; echo "BASH repo /doc: $(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/log/doc' | grep -Eom 1 '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}')"; echo "BASH Reference man(www): $(links -dump 'http://www.gnu.org/software/bash/manual' | grep -om 1 'last updated.*')") \
| cowthink -f tux -n

答案2

这对于cowsay来说不是问题。这就是 shell 处理参数中的换行符的方式:它们被像任何空格一样对待。尝试一下echo $(ls):所有文件都在一行中输出,即使ls确实输出换行符。

幸运的是,您可以通过标准输入将数据传递给cowsay:

(echo "header line"; links ...; links ...; links...) | \
    cowsay -W80 -f bud-frogs

答案3

在考虑了答案之后,我能够通过添加换行符序列并将整个事情传递给cowthink来完成我想做的事情标准输入:

#!/usr/bin/env bash
## bashmancheck - Check different sources for date of the last updates

(echo -e "BASH manual - $(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/tree/doc/bash.1' | grep -om 1 'Last Change.*')\n"; echo -e "Local BASH manual - $(zcat /usr/share/man/man1/bash.1.gz | grep -om 1 'Last Change.*')\n"; echo -e "BASH repo /doc: $(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/log/doc' | grep -Eom 1 '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}')\n"; echo -e "BASH Reference man(www): $(links -dump 'http://www.gnu.org/software/bash/manual' | grep -om 1 'last updated.*')") \
| cowthink -W80 -f tux

 ______________________________________________________________ 
( BASH manual - Last Change: Sun Feb 2 16:21:40 EST 2014       )
(                                                              )
( Local BASH manual - Last Change: Sun Feb 2 16:21:40 EST 2014 )
(                                                              )
( BASH repo /doc: 2014-02-26                                   )
(                                                              )
( BASH Reference man(www): last updated August 22, 2012        )
 -------------------------------------------------------------- 
   o
    o
        .--.
       |o_o |
       |:_/ |
      //   \ \
     (|     | )
    /'\_   _/`\
    \___)=(___/

相关内容