这里需要一些基本的unix shell:对于命令,我看到没有“-”目标在,说艾德:
print '%-2p\nq' | ed -s FILE
我是否可以从某个cmd的stdout提供一个流,而不是FILE名称,作为要处理的数据:
SomeCMD | ed -s SOMETHING_MAGICAL <<< 'print '%-2p\nq'
难道是有可能吗?
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 的评论溜走。
bxfogqkk2#
使用r将命令输出读入文本缓冲区。因此,可移植:
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支持进程替换:
df -h
tmpfs
printf '%s\n' g/tmpfs/d ,p q | ed -s <(df -h)
与gnu ed相对应的那个SOMETHING_MAGICAL被称为!。根据man页面:通过阅读'file'(如果给定)开始编辑。如果'file'以'!'开头,则读取shell命令的输出。
gnu ed
SOMETHING_MAGICAL
!
man
printf '%s\n' g/tmpfs/d ,p q | ed -s '!df -h'
或者,使用 herestring:
ed -s '!df -h' <<< $'g/tmpfs/d\n,p\nq\n'
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命令的最直接的方法,而不必进入转义序列的地狱。具体来说,我们传递四个艾德命令:
<()
df 2> /dev/null | tail -n +2 | egrep "^/dev/"
ed -s
3条答案
按热度按时间bkhjykvo1#
艾德从stdin中读取命令,那么如果您的文件也在stdin中,该如何工作呢?
事实上,如果将stdin的输出与一行连接起来,就可以通过stdin输入文件输入
开始写入数据,然后附加一个 . 结束输入,后面跟着任何命令。您甚至可以将结果输出到stdout。请记住,如果文件中有一行只包含一个 .,则会中断。
因此,如果文件input.file包含以下内容:
文件commands.list包含以下内容:
那么这个命令行...
将输出以下内容:
我敢说哒哒哒!
注意:你可以通过一个过滤器来过滤文件中的单个**.行,然后用ed命令重新转义它们,这样就可以防止文件中出现单个.行。
另一个注意事项:您真的应该使用sed**,但是我不能让 it can 't be done 的评论溜走。
bxfogqkk2#
使用
r
将命令输出读入文本缓冲区。因此,可移植:或
上面的代码读入
df -h
的输出,删除与tmpfs
匹配的行,并打印结果。如果您的shell支持进程替换:
与
gnu ed
相对应的那个SOMETHING_MAGICAL
被称为!
。根据
man
页面:通过阅读'file'(如果给定)开始编辑。如果'file'以'!'开头,则读取shell命令的输出。
或者,使用 herestring:
klr1opcd3#
是的。实际上,您可以使用“进程替换”来传递命令的输出作为要编辑的输入,而不是“管道”到艾德中,从而使标准管道自由地接受预先编写脚本的ed命令。
示例:
说明:
进程替换(
<()
部分)将df 2> /dev/null | tail -n +2 | egrep "^/dev/"
的输出转换为临时文件描述符的内容,然后将其用作ed -s
的输入文件。同时,艾德命令通过echo传递到管道。
这里的Echo用于多行单引号模式,不解释转义序列;如果您不太介意所有内容都显示在一行中,那么这是传递ed命令的最直接的方法,而不必进入转义序列的地狱。
具体来说,我们传递四个艾德命令: