
나는 일반 텍스트나 HTML을 출력하는 사전 프로그램을 가지고 sdcv
있으며 출력을 정규화하는 Bash 스크립트를 작성하여 sdcv
일반 텍스트를 작성할 때 단순히 stdout을 인쇄하거나 lynx
HTML을 출력할 때 형식이 지정된 HTML을 인쇄하는 데 사용합니다.sdcv
이를 위해 sdcv MYWORD | myscript.sh
분석 결과를 파이프라인으로 전달할 수 있는 Bash 스크립트를 만들려고 합니다 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
}