给定以下文件:
foo bar baz
this and that
然后我可以用 ed(1) 轻松通过全局替换“展开”这些行:
g/ /s//\
/g
其结果为:
foo
bar
baz
this
and
that
但是,有什么方法可以平滑地“折线”呢?
我不能在习语中使用\n
或模式。目前我使用以下方法:\<newline>
g/re/s
- 插入空格。
- 加入。
1
+,++s/^/ /
--,.jp
++,+++s/^/ /
--,.jp
,p
找回:
foo bar baz
this and that
但它非常笨重,我想知道是否有更好的方法!
您不应该能够使用
g
命令*中的替换来插入换行符,因此我假设您正在使用 GNUed
(事实证明其他一些ed
实现也可以做到这一点)。我会逐行连接这些行,这可以使用两个命令完成:在当前行末尾添加一个空格,然后将下一行连接到该行:
当处理后续行时,您只需重复
s
和j
命令,命令s
将缩短为仅s
(GNUed
功能)。示例会话;我
nl
在各种情况下使用(以明确的方式显示编号行)只是为了说明正在发生的事情:现在将第 3 行和第 4 行合并到第 2 行:
对于上面的第二次替换,我没有必要说,
2 s
因为我从未离开过第 2 行。如果我使用例如,nl
或一些类似的命令(这会将我们移动到其他地方)列出文件中的行,就像我加入第 1 行时所做的那样,我必须更具体地进行寻址。不用过多看结果:
我本可以使用上面
+ s
的代替2 s
,因为我知道我想在下一行进行后续替换。另一种方法不需要 GNU ,就是先在所有
ed
行的末尾添加一个空格,然后连接我们想要连接的行。然后删除尾随空格:该命令
1;++j
将光标移动到第 1 行,然后将以下两行连接到该行。这更紧凑,但实际上总体上需要更多输入。如果允许作弊,我们可以使用外部
paste
命令。请注意,ed
没有“通过外部命令过滤缓冲区或缓冲区的部分”的概念,因此我们在这里所做的是丢弃当前缓冲区并开始编辑的输出paste
:* 来自POSIX 规范
ed
: