用sed连接某些行

用sed连接某些行,sed,Sed,我有一个如下所示的输入: 1 2 3 4 5 6 我想用sed将其转换为: 12 345 6 我知道使用其他工具可以很容易地完成,但我想将sed作为一种学习练习来具体实现。 我尝试过这样做: sed ':x ; /^ *$/{ N; s/\n// ; bx; }' 但它显示: 123456 有人能帮我解决这个问题吗?引用: 处理段落等文本块(而不是逐行)的常用技术是使用以下结构: sed '/./{H;$!d} ; x ; s/REGEXP/REPLACEMENT/' 第一个表达式

我有一个如下所示的输入:

1
2

3
4
5

6
我想用sed将其转换为:

12
345
6
我知道使用其他工具可以很容易地完成,但我想将sed作为一种学习练习来具体实现。 我尝试过这样做:

sed ':x ; /^ *$/{ N; s/\n// ; bx; }'
但它显示:

123456
有人能帮我解决这个问题吗?

引用:

处理段落等文本块(而不是逐行)的常用技术是使用以下结构:

sed '/./{H;$!d} ; x ; s/REGEXP/REPLACEMENT/'
  • 第一个表达式,
    /./{H;$!d}
    对所有非空行进行操作,并将当前行(在模式空间中)添加到保留空间。在除最后一行之外的所有行上,删除模式空间并重新开始循环

  • 其他表达式
    x
    s
    仅在空行(即段落分隔符)上执行。
    x
    命令将累积行从保留空间提取回图案空间。然后,
    s//
    命令对段落中的所有文本(包括嵌入的换行符)进行操作

  • 事实上

    sed '/./{H;$!d} ; x ; s/\n//g'
    

    做你想要的。

    GNU
    awk
    方法:

    $ awk -F"\n" '{gsub("\n","");}1' RS='\n{2,}' file
    12
    345
    6
    

    注意,它将在最后一行之后添加一个尾随换行符
    \n

    FWIW以下是如何在UNIX中真正完成该任务:

    $ awk -v RS= -v OFS= '{$1=$1}1' file
    12
    345
    6
    

    以上内容适用于任何UNIX设备。

    可能类似于:
    s/\n([^\n])/\1/
    ?wrt
    我想把sed作为一个学习练习来做这件事
    -这是一个令人钦佩的目标,但你将学习如何做一些你永远不应该做的事情,这有什么意义呢?对,但sed唯一最适合的是在单个行中使用
    s/old/new
    ,你不需要大量的经验来学习如何做那个所有用于做其他事情的sed语言结构(例如this)在大约40年前就已经过时了。因此,为什么不学习使用标准UNIX工具完成所有工作的简单、健壮、高效、可移植和可维护的方法,而不是学习如何编写神秘的sed脚本,如果你在错误的位置放了分号,这些脚本可能会调用黑暗之神Cthulu?@EdMorton hahaha。我必须承认我懒洋洋的。这只是一个自我完善的问题。Sed语法既笨重又过时(如Perl),但即使出于历史原因,也值得学习。是的,我想我们都对金字塔是如何建造的感兴趣,但这并不意味着任何人都会很快在后院建造金字塔。只要你没有发现自己在真正的软件中使用它,我想知道一些咒语是没有害处的。。。