希望sed具有与ed的方便j命令相同的功能

时间:2016-04-22 11:16:41

标签: linux shell unix sed ed

我一直在告诉我,sed没有像j这样的ed命令。

This question询问如何一般地加入行,并且有许多好的答案,其中很多都使用其他工具,例如awkperl。并且还有一些sed解决方案,但它们都涉及使用s命令逐字编辑换行符,这是一种解决方案,由于各种原因使我感觉像kludgey。

现在,sed也有一些模糊的命令与" hold"和"模式"空间,我从来没有想过如何使用。我总是假设--BICBW - 保持空间是j命令的答案,只要我能弄清楚如何使用它。

所以我今天的问题 - 这就像知识分子和实际问题一样 - 是否有一种良好,安全,合理简洁的方法来做同等的事情

sed /pat/j

也就是说,对于包含模式pat的每一行,请将其连接到以下行(即,如果我使用ed,就像g/pat/j/一样。)

正如我所说,这有点是一个智力问题。我知道如何使用其他工具加入行,或者在引用的文字换行符上使用seds命令。但在我看来应该有更好的方法。

(或者我应该只是查看sed.c的副本并使用正确的j命令进行攻击。)

2 个答案:

答案 0 :(得分:3)

sed  '/pat/{$!{N;s/\n/ /}}'

如果pat匹配且行不是最后一行,请在此行中添加以下行,然后将\n替换为空格

参考:how-can-i-use-sed-to-replace-a-multi-line-string

答案 1 :(得分:1)

我知道这很难吞下,但老实说 - sed是针对单个行的简单替换,以及你应该使用awk的任何其他内容。我发现sed非常有用并且几乎每天都使用它30多年,但是在70年代中期发明awk时,所有除了单独行上的简单替换之外的任何其他结构都变得过时了。

$ seq 4 | awk '{printf "%s%s", s, $0; s=ORS} /2/{s=OFS} END{print ""}'
1
2 3
4

如何按2s加入行:

$ seq 10 | awk '{printf "%s%s", $0, (NR%2?OFS:ORS)}'
1 2
3 4
5 6
7 8
9 10

尝试修改连接2行的sed脚本来代替连接5行。与将数字2更改为数字5的简单明显的awk调整相比较:

$ seq 10 | awk '{printf "%s%s", $0, (NR%5?OFS:ORS)}'
1 2 3 4 5
6 7 8 9 10

以上内容适用于所有操作系统的所有问题,如果/当您的需求发生变化时,只需极少的更改即可轻松增强 - 这是您应该学习使用awk而不是sed的两个非常重要的原因。