如何为需要文件名的ed提供stdin?

时间:2012-10-17 08:50:41

标签: linux shell unix ed

这里需要一些基本的unix shell:

对于我看不到“ - ”目标的命令,比如编辑:

print '%-2p\nq' | ed -s FILE

我可以从某个cmd的stdout而不是FILE名称提供一个流作为要处理的数据:

SomeCMD | ed -s SOMETHING_MAGICAL <<< 'print '%-2p\nq'

有可能吗?

2 个答案:

答案 0 :(得分:8)

ed 从stdin读取它的命令,所以如果你的文件也在stdin上,你怎么工作?

事实上,如果你将输出连接到一行,可以通过stdin输入文件输入

i

一开始,要开始写入数据,然后附加一个来结束输入,然后是任何命令。您甚至可以将结果输出到stdout。请记住,如果文件中只有一行,只有一个,它就会中断。

因此,如果文件 input.file 包含:

First line
Second line
Third line

文件 commands.list 包含以下内容:

.
1d
1,$w /dev/stdout

然后这个命令行......

echo i | cat - input.file commands.list | ed -s

将输出:

Second line
Third line

我敢说 tadaaaaa!

注意:您可以防止文件中单个行的情况,方法是将文件通过一个过滤掉任何此类行的过滤器,然后再使用 ed 命令。我把它留给你的聪明才智。

另一个注意事项:你真的应该使用 sed ,但我不能让无法完成评论。

答案 1 :(得分:2)

使用r将命令输出读入文本缓冲区。所以,便携式:

printf '%s\n' 'r !df -h' g/tmpfs/d ,p q | ed -s

ed -s << IN
r !df -h
g/tmpfs/d
,p
q
IN

以上读取df -h的输出,删除与tmpfs匹配的行并打印结果。
如果您的shell支持进程替换:

printf '%s\n' g/tmpfs/d ,p q | ed -s <(df -h)

gnu ed SOMETHING_MAGICAL被称为! 根据{{​​1}}页面:

  

通过阅读&#39;文件&#39>开始编辑如果给予。如果&#39; file&#39;以a开头   &#39;!&#39;,读取shell命令的输出。

man

或者,使用 herestring

printf '%s\n' g/tmpfs/d ,p q | ed -s '!df -h'