通过 aspell 对用户的输入进行拼写检查,但是如何在这种情况下调用交互模式呢?

通过 aspell 对用户的输入进行拼写检查,但是如何在这种情况下调用交互模式呢?

我编写了一个接收用户句子的脚本,我想将字符串通过管道传输到阿斯佩尔然后得到交互的屏幕的建议(以防用户有一些拼写错误)。之后,这些单词将被发送回脚本,我会用相应的单词替换拼写错误。

我知道 aspell 选项:

1) 检查文件是否有拼写错误并显示建议列表在交互模式下:

aspell check <file name>

2) 检查文件是否有拼写错误并显示建议列表不在交互模式下:

cat <filename> | aspell -a

但如果我尝试选项一,我会得到“错误:标准输入不是终端。”,我会很高兴得到任何富有成效的提示如何克服这个问题? :)

谢谢

答案1

我认为,如果不使用临时文件,您就无法逃脱。通过命令替换的形式zsh对此有内置支持。=(...)

在这里,要对变量的内容( 的输出printf %s $string)进行拼写检查:

{
  (){
    aspell check -x $1 >&3 3>&-
    cat $1
  } =(printf %s $string) | IFS= read -rd '' corrected_string
} 3>&1

答案2

这是对我有用的解决方案:

TMP_FILE=`mktemp`

echo "${USER_INPUT}" > "${TMP_FILE}"

# Allows me to read user input below, assigns stdin to keyboard
exec < /dev/tty

# I'm assuming you have a aspell (spell checker) installed on your system
# invoke aspell and check for typos
/usr/bin/aspell check "${TMP_FILE}"

ANSWER=$(cat $TMP_FILE )

if [[ "${ANSWER}" != "${USER_INPUT}" ]]; then
    echo "After applying fixes: ${ANSWER}"
fi

享受!

答案3

我写了一个 1 行 shell 脚本,我称之为 dict:

#!/bin/sh
echo $* | aspell pipe

dict charitible @(#) International Ispell Version 3.1.20 (但实际上是 Aspell 0.60.7-20110707)
& charitible 8 0: 慈善的、慈善的、可遗传的、可写的、可写的、可信的、可共享的、易怒的

相关内容