这里需要一些基本的unix shell:
对于我在 中看不到“-”目标的命令,请说 ed:
print '%-2p\nq' | ed -s FILE
我可以提供来自某些 cmd 的 stdout 的流,而不是 FILE 名称,作为要处理的数据:
SomeCMD | ed -s SOMETHING_MAGICAL <<< 'print '%-2p\nq'
有可能吗?
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,但我不能让它无法完成的评论消失。
您用于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
被称为!
。
根据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'