最近,我遇到了这个很棒的fortune
命令,并立即使用它来向持久聊天发送夜间报价。
现在我想知道如何删除强制换行符引用部分,但将它们保留在作者行在最后。
为什么?由于聊天窗口的宽度不同,在大多数情况下,生成的输出是双换行的(这没有很好地表达,但您可能已经理解我的意思 - 如果没有,这对您很重要,请随时要求澄清)。
当然,我已经搜索了解决方案并发现:
echo -n `fortune`
但这显然消除了所有换行符。
最受赞赏的是sh
兼容的解决方案,但如果大大增加简单性,bash
(其他?)也将是一种选择。
2016年2月12日更新:
根据要求,多行财富输出示例:
me@myhost:~$ fortune
Mit jemand leben oder in jemand leben, ist ein großer
Unterschied. Es gibt Menschen, in denen man leben kann, ohne mit
ihnen zu leben, und umgekehrt. Beides zu verbinden, ist nur der
reinsten Liebe und Freundschaft möglich.
-- Goethe, Maximen und Reflektionen, Nr. 649
me@myhost:~$
下面建议的解决方案可以做到这一点:
me@myhost:~$ fortune | sed ':a;N;$!ba;s/\n[[:space:]]\{2\}--/ --/'
Die so genannten Naturdichter sind frisch und neu aufgeforderte,
aus eine rüberbildeten, stockenden, manierierten Kunstepoche
zurückgewiesene Talente. Dem Platten können sie nicht ausweichen, man
kann sie daher als rückschreitend ansehen; sie sind aber
regenerierend und veranlassen neue Vorschritte. -- Goethe, Maximen und Reflektionen, Nr. 258
me@myhost:~$
这是一个非常好的建议,但没有提供确切的期望解决方案。它的作用与我想要实现的目标相反。一旦我理解了 sed 表达式,我就会尝试反转逻辑......随意比我快! :D
答案1
echo $(fortune) | sed 's/-- /\n -- /'
在作者行之前插入任意数量的前导空格。这只是用来echo
去掉回车符,然后用换行符和作者前缀替换作者前缀。
答案2
这大部分是偷来的这里:
fortune | sed ':a;N;$!ba;s/\n[[:space:]]\{2\}--/ --/'
从原来的答案来看:
解释:
- 通过创建标签
:a
。- 通过 将当前行和下一行追加到模式空间
N
。- 如果我们在最后一行之前,则分支到创建的标签
$!ba
($!
意味着不要在最后一行执行此操作,因为应该有一个最终换行符)。
最后一步是我唯一修改的一步。由于该模式是两个连接的行,因此搜索前面--
有两个或多个空格和换行符(据我所知,该模式仅显示在引号中)。将换行符替换为一个空格,然后添加回--
已删除的内容。
前:
There is always one thing to remember: writers are always selling somebody out.
-- Joan Didion, "Slouching Towards Bethlehem"
后:
There is always one thing to remember: writers are always selling somebody out. -- Joan Didion, "Slouching Towards Bethlehem"
答案3
人们可以将文件视为单个字符串,然后仅替换后面跟着两个换行符的换行符。该解决方案假设非空行。
bash-4.1$ cat input
duck
duck
duck
-- goose
bash-4.1$ perl -0777 -ple 's/\n(?=[^\n]+\n[^\n]+\n)/ /g' input
duck duck duck
-- goose
bash-4.1$
另一种解决方案是将这些行构建到内存中的行数组中,然后将该数组与空格连接(最后一行除外),或者首先计算有多少行,然后用该数字确定何时应该换行转换为空格或单独保留。