回复电子邮件:如何将多个"空白"(不是空白;仅包含">"的行)压缩成一个?

use*_*237 9 unix sed

我试图做一些像这样,但对于引用的电子邮件,所以这

On 2014-07-11 at 03:36 PM, <ilovespaces@email.com> wrote:                                                                                                                                                                                                                                                       
>Hi Everyone,                                                                                                                                                                                                                                                                                                                 
>                                                                                                                                                                                                                                                                                                                             
>                                                                                                                                                                                                                                                                                                                              
>                                                    
>I love spaces.
>                                                                                                                                                                                                                                                                                                                             
>                                                                                                                                                                                                                                                                                                                          
>                                                                                                                                                                                                                                                                                                                          
>That's all.                                                                                                                                                                                                                                                                                                                       
Run Code Online (Sandbox Code Playgroud)

会成为这个

On 2014-07-11 at 03:36 PM, <ilovespaces@email.com> wrote:                                                                                                                                                                                                                                                       
>Hi Everyone,                                                                                                                                                                                                                                                                                                                 
>                                                                                                                                                                                                                                                                                                                             
>I love spaces.
>                                                                                                                                                                                                                                                                     
>That's all.   
Run Code Online (Sandbox Code Playgroud)

谢谢

Nou*_*him 13

假设每条视觉线都是一条合适的逻辑线(以a结尾的字符串\n),您可以省去其余的工具并简单地uniq(1)在输入上运行.

示例如下.

% cat tst
>Hi Everyone,
>
>
>
>I love spaces.
>
>
>
>That's all.

% uniq tst
>Hi Everyone,
>
>I love spaces.
>
>That's all.
%
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。我在所有指导课程中都强调UNIX 101的原因之一。 (2认同)

WKP*_*lus 2

尝试这个:

sed -r '/^>\s*$/{N;/^>\s*\n>\s*$/D}'
Run Code Online (Sandbox Code Playgroud)

解释如下:

使用的命令:

  1. N将下一行输入追加到模式空间中。
  2. D最多删除模式空间中第一个嵌入的换行符。开始下一个周期,但如果模式空间中仍有数据,则跳过从输入读取。

使用的模式:

  1. /^>\s*$/匹配包含 '>' 且后跟零个或多个空格的行
  2. /^>\s*\n>\s*$/匹配两个连续行,其中>包含零个或多个空格,与 一起使用时N

所以上面sed命令的工作流程是:

  1. 将一行读入模式空间(如果遇到文件末尾,则退出)
  2. 如果模式空间仅包含“>”,则转到步骤 4,否则转到步骤 3
  3. 打印模式空间中的上下文并转到步骤 1
  4. 将 '\n' 和下一行追加到模式空间,如果模式空间仅包含 '>\n>'(这意味着我们遇到两个连续的 '>' 行),则转到步骤 5,否则转到步骤 3
  5. 删除 '\n'(包括)之前的上下文,然后转到步骤 2