如何使用 sed 将换行符替换为任何其他字符?
输入:
I cannot conceive that anybody will
require multiplications at the rate of
40,000 or even 4,000 per hour ...
-- F. H. Wales (1936)
期望的输出:
I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour ... -- F. H. Wales (1936)
我试过了:
> pbpaste | sed 's/\n/ /g'
但它输出与输入相同的东西。我知道这是一个换行符,因为我已经检查过它并且它按预期cat -ev
打印。$
还有什么更好的命令可以做到这一点?
这显示新行之间有额外的空间。我也想删除它。所以这就像一个带有空格的句子。
> pbpaste | cat -ev
I cannot conceive that anybody will $
require multiplications at the rate of $
40,000 or even 4,000 per hour ... $
$
-- F. H. Wales (1936) ⏎
答案1
tr
可能是完成这项工作的更好工具。尝试以下操作
pbpaste | tr '\n' ' '
根据您的输入,我得到以下输出。
I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour ... -- F. H. Wales (1936)
答案2
您可以通过循环使用以下命令来完成此操作sed
(即使没有 GNU slurp 扩展):-z
N
$ sed -e :a -e '$!N;s/ *\n */ /;ta' -e 'P;D' input
I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour ... -- F. H. Wales (1936)
有关本质上等效命令的讨论,请参见示例40. 如果前一行以等号“=”开头,则在前一行后面追加一行在Sed 行话解释,第一部分
答案3
我同意@QIS。
有几个原因导致 sed 不适合您。
其一是,默认情况下,sed
一次处理一行输入,因此,sed
永远不会看到换行符部分的一条线。这是一个分隔符之间行,默认情况下。
另一个问题是,虽然 GNUsed
实现了'\n'
换行符的表示,但 BSD sed
(OSX 上的版本)却没有。
对于任何sed
可能阅读您的问题的未来 GNU 用户,sed
可以使用该选项告诉 GNU 将输入文件视为 NUL 分隔的字符串列表-z
。假设您的输入不包含 NUL 字节,这可能是 GNUsed
用户的一个选项:
$ pbpaste | sed -z 's/\n/ /g'
一种简单的(且不推荐)方法是利用这样一个事实:当echo
由于命令替换而收到未加引号的换行符时,它将用空格替换它们。另外,echo
会将多个空格(或换行符)转换为单个空格。因此,这很可能也适合您:
echo $(pbpaste)
答案4
和fmt
都是par
重新格式化文本的好工具。
在将换行符替换为空格(例如用 )后,它们都可以用于将文本重新格式化为单行长行tr
:
$ tr '\n' ' ' < input.txt | fmt -w 999
I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour ... -- F. H. Wales (1936)
$ tr '\n' ' ' < input.txt | par w999
I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour ... -- F. H. Wales (1936)
请注意,fmt 和 par 的输出略有不同。 fmt...
和之间有四个空格--
,而 par 将它们减少为一个空格。
更多关于fmt
和par
:
fmt
是一个已经存在了几十年的标准实用程序,并且几乎可以在任何 UNIX 系统上使用。在 GNU/Linux 系统上,它位于 GNUcoreutils
软件包中。
$ fmt < input.txt
I cannot conceive that anybody will require multiplications at the rate
of 40,000 or even 4,000 per hour ...
-- F. H. Wales (1936)
然而,它非常简单,并且不允许对如何重新格式化段落进行太多控制,也不对前导和/或尾随字符执行任何特殊处理(例如>
在电子邮件或/* ... */
评论中引用),这可能会导致混乱混乱。
par
更加灵活和有能力。它可以重新格式化 C 风格的/* ... */
注释和盒装文本、具有多级引用的电子邮件等。以下示例并未显示它的真正功能。
$ par < input.txt
I cannot conceive that anybody will require multiplications at the rate of
40,000 or even 4,000 per hour ...
-- F. H. Wales (1936)
以下示例(来自man par
)开始展示par
的功能:
Before:
John writes:
: Mary writes:
: + Anastasia writes:
: + > Hi all!
: + Hi Ana!
: Hi Ana & Mary!
Please unsubscribe me from alt.hello.
After "par Q+:+ q":
John writes:
: Mary writes:
:
: + Anastasia writes:
: +
: + > Hi all!
: +
: + Hi Ana!
:
: Hi Ana & Mary!
Please unsubscribe me from alt.hello.
自从我发现 20 世纪 90 年代以来,我每天都在 vi/vim 中使用它来重新格式化我正在编写的电子邮件(或来自其他人的带有难以阅读的长行的电子邮件)、代码注释和其他文本。 IMO,par 是一个不可或缺的必备程序。