运行 ed(1) 脚本时回显 stdin

eze*_*zon 6 shell stdin ed

鉴于以下ed脚本,

$ cat helloworld
a
hello
world
.
,n
,s,o,O,g
,n
Q
Run Code Online (Sandbox Code Playgroud)

我想以某种方式获得交互式输出

$ ed
a
hello
world
.
,n
1   hello
2   world
,s,o,O,g
,n
1   hellO
2   wOrld
Q
$
Run Code Online (Sandbox Code Playgroud)

而不是预期的

$ cat helloworld | ed
1   hello
2   world
1   hellO
2   wOrld
$
Run Code Online (Sandbox Code Playgroud)

这可能吗,也许使用第三方实用程序?提前致谢!

编辑:我想我应该增加一些动力。我想制作一些示例 ed 会话,并可能将它们保存为script(1). 如果此过程是“实时”执行的,则任何修改基本上都意味着再次键入整个教程(不好)或“弄清楚”输出,这可能是基于长时间的编辑会话(更糟)。

don*_*sti 4

好吧,在胡闹之后,这就是我要使用的:

 awk '{ print; system("sleep 0") }' edscript | tee /dev/tty | ed
Run Code Online (Sandbox Code Playgroud)

或者,没有tee

awk '{ print >"/dev/stderr"; print | "ed"; system("sleep 0") }' edscript
Run Code Online (Sandbox Code Playgroud)

如果print >"/dev/stderr"在您的系统上不起作用,您可以使用print | "cat >&2".


gnu sed

sed -u -n -e 'p;w /dev/stderr' -e 's|.*||e' edscript | ed
Run Code Online (Sandbox Code Playgroud)

另一种同样有效的方法:
用于在每一行上split分割您的edscript :

split -l1 edscript
Run Code Online (Sandbox Code Playgroud)

这将产生类似xaaxab...的作品xah
然后你可以像这样使用这些部分:

for i in x*; do awk '{ print >"/dev/stderr"; print }' $i; done | ed
Run Code Online (Sandbox Code Playgroud)

或者

for i in x*; do sed -n -e 'p;w /dev/stderr' $i; done | ed
Run Code Online (Sandbox Code Playgroud)

以获得预期的结果。然后你rm x*...