我一直在告诉我,sed
没有像j
这样的ed
命令。
This question询问如何一般地加入行,并且有许多好的答案,其中很多都使用其他工具,例如awk
和perl
。并且还有一些sed
解决方案,但它们都涉及使用s
命令逐字编辑换行符,这是一种解决方案,由于各种原因使我感觉像kludgey。
现在,sed
也有一些模糊的命令与" hold"和"模式"空间,我从来没有想过如何使用。我总是假设--BICBW - 保持空间是j
命令的答案,只要我能弄清楚如何使用它。
所以我今天的问题 - 这就像知识分子和实际问题一样 - 是否有一种良好,安全,合理简洁的方法来做同等的事情
sed /pat/j
也就是说,对于包含模式pat
的每一行,请将其连接到以下行(即,如果我使用ed
,就像g/pat/j/
一样。)
正如我所说,这有点是一个智力问题。我知道如何使用其他工具加入行,或者在引用的文字换行符上使用sed
和s
命令。但在我看来应该有更好的方法。
(或者我应该只是查看sed.c
的副本并使用正确的j
命令进行攻击。)
答案 0 :(得分:3)
sed '/pat/{$!{N;s/\n/ /}}'
如果pat
匹配且行不是最后一行,请在此行中添加以下行,然后将\n
替换为空格
答案 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的两个非常重要的原因。