我有一个字典程序,sdcv
它输出普通文本或 HTML,并且我正在编写一个 Bash 脚本来规范化输出,以便它在sdcv
编写普通文本时简单地打印 stdout,或者在输出 HTMLlynx
时使用它打印格式化的 HTML。sdcv
为此,我正在尝试制作一个可以通过管道传输的 Bash 脚本,sdcv MYWORD | myscript.sh
该脚本将分析sdcv
的输出。问题是sdcv
有两个输出,我需要在第一个输出的基础上格式化第二个输出。第一次输出后,sdcv
需要用户输入,然后打印第二次输出。
我尝试过使用FIRST_OUTPUT=$(tee /dev/tty)
,但问题是这合并了sdcv
的第一个输出、sdcv
和sdcv
的第二个输出请求的我的输入,并且在输入输入之前我无法访问任何内容。
我该如何继续?
答案1
<html...
也许您可以将以该命令开头和结尾的行序列通过管道传输到</html...
该命令lynx
(或者可能更好elinks
或w3m
)。
喜欢:
#! /usr/bin/perl
while (<<>>) {
if (!$inhtml && m{<html}i) {
$inhtml = 1;
open HTML, "|-", qw(elinks -dump);
}
print {$inhtml ? HTML : STDOUT} $_;
if ($inhtml && m{</html}i) {
close HTML;
$inhtml = 0;
}
}
(和sdcv MYWORD | that-script
)
答案2
这对我来说结束了工作,答案是一段痛苦的期待之旅。我毫不怀疑这段代码还有改进的空间,所以请随时留下您的建议!
#!/usr/bin/expect -f
set arg1 [lindex $argv 0]
spawn sdcv $arg1
expect "Found*" {
expect "Your choice*" {
expect_user -re "(.*)\n"
set user_input $expect_out(0,string)
send "$user_input\r"
expect "#"
set output $expect_out(buffer)
set command "echo \"$output\" | lynx --dump --stdin"
spawn bash
expect "*"
send "$command\r"
expect "$command\r\n"
expect eof
}
#for some reason gets saved to expect_out(0,string) when we input a word with a single match
set output $expect_out(0,string)
set command "echo \"$output\" | lynx --dump --stdin"
spawn bash
send "$command\r"
expect "$command\r\n"
expect eof
}