是否有命令行工具可将换行符插入长字符串?


18

给定一个需要以有限的文本宽度显示的长字符串,* nix中是否有一个命令行工具可将单行字符串转换为多行字符串,且每行的长度不超过给定的文本宽度?

例如,给定以下字符串

$ MYSTRING="Call me Ishmael. Some years ago - never mind how long precisely - having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world."

我想这样格式化:

$ echo $MYSTRING | special-format-command --width=30
Call me Ishmael. Some years ag
o - never mind how long precis
ely - having little or no mone
y in my purse, and nothing par
ticular to interest me on shor
e, I thought I would sail abou
t a little and see the watery 
part of the world.

Answers:


24

您可以尝试以下fold命令:

echo "$MYSTRING" | fold -w 30

2
+1,但最好写成echo $MYSTRING | fold -w 30,因为-30语法没有出现在折叠手册页中
ire_and_curses 2013年

5
对于后代,也有fmtfold和之间的区别fmt是,它们fold将以固定的宽度环绕,甚至会拆分单词,并可能以空格开头。虽然fmt将在宽度附近或下方缠绕,但不会拆分单词,行也不会以空格开头,并且可能会合并短行。
bahamat 2013年

5
fold似乎与使用fmt-s选项时具有相似的行为。
科里·克莱恩

有趣的是,我使用了-w选项,但按字符将其拆分。
2013年


6

的全部目的fmt(GNU的coreutils,并IIRC其他版本的一部分被列入非GNU * nixes,因此几乎可以肯定已经安装)是重新格式化段落。

但是,有一个甚至更好的工具par(用于段落重新格式化)。它可以做所有fmt可以做的事,但是有更多的选择来控制确切的输出格式。

许多真正有趣的事情之一par是,处理电子邮件中的引用(甚至是多个级别的引用)非常聪明-非常有用...我设置了.vimrc,以便按F5键可以将当前段落发送到par。

如果未为您的发行版打包(适用于Debian和衍生产品,也可能适用于其他发行版),则可以在http://www.nicemice.net/par/中找到par


用“非GNU * nixes”表示“真正的”(不是“类Unix”的)Unix吗?(似乎还可以使用其他很酷的工具。)
Emanuel Berg 2013年

我的意思是现在已经过时的专有垃圾* nixes。
cas

那就是我的想法,但是为什么要使用星号呢?我认为这是为了避免必须始终键入“类Unix”(对于Linux等)。(我不是在细节上烦扰您-或,我是-但我真的很想知道,我不是为了这个烦扰您。)
Emanuel Berg 2013年

*nix只是说“通用unix或类似unix的系统”的一种方式-它可以追溯到Unix是AT&T的专有商标的时间
cas

3

fold -s 是您问题的最短,最佳答案。

但是,在某些情况下,尽管这些工具是通用的,但通常应该让您的编辑器执行此操作。

在Emacs中,您可以根据需要进行调整。对于我来说,我使用visual-line-modeWrap在模式行中显示为次要模式)是因为在一般情况下,除了段落的结尾,我不希望换行。

我以为我会告诉我这样做的方式。它不是“ the”方式,而是一种方式。正如我提到的函数和变量一样,您的方法是将它们组合在一起并使其自动化以使其适合您。(这是Emacs,但是对于任何足够高级的编辑器,都可以写类似的文章。)

我说过,键入时我用视觉包裹了线条,从不手动断开它们。与往常一样,也有例外:例如,GNUS不会将行数超过一定宽度(以字符为单位)的帖子发送到Usenet。因此,然后使用M-q。在Emacs中,M-q运行命令fill-paragraph。该变量fill-column控制填充的宽度。举个例子,如果我这样写(一行)

This is a lot of text being written right now. The purpose is to overflow the line so I have have to line break it with M-q.

然后使用Mq,我得到

This is a lot of text being written right now. The purpose is to
overflow the line so I have have to line break it with M-q.

使用justify-current-line(两次两行),您得到

This  is a lot  of text  being written  right now.  The purpose  is to
overflow  the  line  so  I  have  have to  line  break  it  with  M-q.

但是,我发现人们很少使用等宽字体来查看事物,因此使用它并不是很有意义(除了我自己的观看乐趣)。如果你喜欢它,你可以调整fill-paragraph,以填补,并在同一时间证明。你也可以有Emacs的为你做这个,总是为你键入:auto-fill-mode。(我感到压力很大,但这就是我。)

这似乎是很多工作,而且确实如此。但是一旦完成(使用此功能和其他1000项功能),您就可以真正享受按自己喜欢的方式使用工具的乐趣。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.