私はプレーンテキストまたはHTMLを出力する辞書プログラムを持っており、出力を正規化するsdcv
Bashスクリプトを書いてプレーンテキストをsdcv
書くときに単にstdoutを印刷するか、lynx
HTMLを出力するときにフォーマットされたHTMLを印刷するために使用します。sdcv
そのために、sdcv MYWORD | myscript.sh
分析結果をパイプラインに渡すことができるBashスクリプトを作成しようとしていますsdcv
。問題は、sdcv
2つの出力があり、最初の出力に基づいて2番目の出力をフォーマットする必要があることです。最初の出力後にsdcv
ユーザー入力が必要で、2番目の出力が印刷されます。
私は試してみましたが、FIRST_OUTPUT=$(tee /dev/tty)
問題はこれがsdcv
要求の最初の出力sdcv
とsdcv
私の入力の2番目の出力をマージし、入力が入力されるまで何もアクセスできないことです。
どうやって進めますか?
答え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
}