Буферизация будет проблемой, так как scala
может использовать буферизацию на основе блоков -из-за конвейера (вместо буферизации на основе терминальной линии -по умолчанию, см. setvbuf(3)
), а также буферизацию, выполняемуюsed
(или что-то еще в процессе разработки ). Вы можете попробовать налепить stdbuf
на все подряд, отказаться от портативности и молиться, чтобы эти LD_PRELOAD
обезьяньи патчи работали; другой вариант вместо этого может состоять в том, чтобы запустить REPL под PTY, передать ему пользовательский ввод и заменить вывод перед его отправкой. Это здесь показывает SBCL, так как scala
восхитительно не работал -на моей машине.
$./mochanichize sbcl
This is SBCL 1.3.20, an implementation of ANSI Common Lisp.
More information about SBCL is available at .
SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
* (print "Java")
"Mocha"
"Mocha"
* (exit)
$
И код для mochanichize
.
#!/usr/bin/env expect
package require Tcl 8.5
proc mochanichize {fh} {
global godot
set somedata [read $fh]
if {[eof $fh]} { close $fh; set godot 1; return; }
regsub -all {\mJava\M} $somedata {Mocha} somedata
puts -nonewline $somedata
}
proc sendtoprog {from to} {
# TODO support ^D but that's more complicated
puts -nonewline $to [read $from]
}
# no echo on PTY command we're running (soas not to duplicate what is
# echo'd back to the user via the user tty)
set stty_init -echo
if {[catch {spawn -noecho {*}$argv} err]} { puts stderr $err; exit 1 }
chan configure $spawn_id -blocking 0 -buffersize 1
chan event $spawn_id readable [list mochanichize $spawn_id]
chan configure stdin -blocking 0 -buffersize 1
chan configure stdout -blocking 0 -buffersize 1
chan event stdin readable [list sendtoprog stdin $spawn_id]
# TODO better handle ^Z this goes all meh on it
trap SIG_IGN SIGTSTP
vwait godot
Это не совсем ответ, а то, что я делюсь личным микроинструментом, который часто использую для нормализовать текстовые файлы (txtnorm):
#!/usr/bin/perl -spi
our($s);
s/\n\r|\r\n|\n|\r/\n/g; ## normalize \n
s/^(\xFF\xFE|\xFE\xFF|\xEF\xBB\xBF)//; ## remove BOM !
s/(?<=.)\z/\n/; ## ensure newline at eof
if($s){ s/\xC2\xA0/ /g } ## -s non breaking spaces-> " "
txtnorm *.txt
нормализует конец -строк -, обеспечивает новую строку в конце, удаляет спецификации и (с -s )может нормализовать неразрывные пробелы -.
Обязательно используйте его ТОЛЬКО для текстовых файлов.