用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),但即使出于历史原因,也值得学习。是的,我想我们都对金字塔是如何建造的感兴趣,但这并不意味着任何人都会很快在后院建造金字塔。只要你没有发现自己在真正的软件中使用它,我想知道一些咒语是没有害处的。。。