4

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

对于我在 中看不到“-”目标的命令,请说 ed:

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

我可以提供来自某些 cmd 的 stdout 的流,而不是 FILE 名称,作为要处理的数据:

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

有可能吗?

4

2 回答 2

10

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

事实上,你可以通过标准输入提供文件输入,如果你用一行连接它的输出

i

一开始,开始写入数据,然后附加一个. 结束输入,然后是任何命令。您甚至可以将结果输出到标准输出。请记住,如果文件中有一行只有一个. 在里面。

因此,如果文件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!?

注意:您可能可以防止 single 的情况文件中的行通过管道通过过滤器来转义任何此类行,然后使用ed命令再次取消转义它们。我把它留给你的聪明才智。

另一个注意事项:您确实应该为此使用sed,但我不能让它无法完成的评论消失。

于 2012-10-17T13:21:06.703 回答
3

您用于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 edSOMETHING_MAGICAL被称为!
根据man页面:

如果给定,通过读入“文件”开始编辑。如果 'file' 以 '!' 开头,则读取 shell 命令的输出。

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

或者,使用herestring

ed -s '!df -h' <<< $'g/tmpfs/d\n,p\nq\n'
于 2014-12-30T23:48:31.743 回答