unix 我如何向需要文件名的艾德提供stdin?

lzfw57am  于 2022-11-04  发布在  Unix
关注(0)|答案(3)|浏览(209)

这里需要一些基本的unix shell:
对于命令,我看到没有“-”目标在,说艾德:

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

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

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

难道是有可能吗?

bkhjykvo

bkhjykvo1#

艾德从stdin中读取命令,那么如果您的文件也在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

我敢说哒哒哒!
注意:你可以通过一个过滤器来过滤文件中的单个**.行,然后用ed命令重新转义它们,这样就可以防止文件中出现单个.行。
另一个注意事项:您真的应该使用
sed**,但是我不能让 it can 't be done 的评论溜走。

bxfogqkk

bxfogqkk2#

使用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'(如果给定)开始编辑。如果'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'
klr1opcd

klr1opcd3#

是的。实际上,您可以使用“进程替换”来传递命令的输出作为要编辑的输入,而不是“管道”到艾德中,从而使标准管道自由地接受预先编写脚本的ed命令。
示例:

echo '#
,s/\/dev\/\(\w*\) .* \b\(.*\)%.*$/DEVICE \1 is \2% full!/
,p
Q' | ed -s <(df 2> /dev/null | tail -n +2 | egrep "^/dev/")

DEVICE sda6 is 90% full!
DEVICE sda2 is 88% full!

说明:
进程替换(<()部分)将df 2> /dev/null | tail -n +2 | egrep "^/dev/"的输出转换为临时文件描述符的内容,然后将其用作ed -s的输入文件。
同时,艾德命令通过echo传递到管道。
这里的Echo用于多行单引号模式,不解释转义序列;如果您不太介意所有内容都显示在一行中,那么这是传递ed命令的最直接的方法,而不必进入转义序列的地狱。
具体来说,我们传递四个艾德命令:

  • 注解(仅用于对齐控制台上的其余命令)
  • 替换命令
  • "打印全部“命令
  • 一个“无条件退出”命令,用于防止任何可能在终端上打印的警告消息。

相关问题