sed 用空格替换换行符

sed 用空格替换换行符

如何使用 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 扩展):-zN

$ 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 将它们减少为一个空格。


更多关于fmtpar

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 是一个不可或缺的必备程序。

相关内容