Shell 脚本可以使用管道。
cat "$@" |
tr -cs "a-zA-Z0-9." '\012' |
{
old="aaa."
while read new
do
case "$old" in
*.) : OK;;
*) echo "$old $new";;
esac
old="$new"
done
}
该代码cat用作数据的通用收集器 -tr是一个不接受任何文件名参数的纯过滤器。基本思想是变量old包含第一个单词,new读取新单词。当 old 以句点结尾时(就像开头一样),根据您的规则,它不会形成有效的二元组。如果要从句子结尾的二元组中删除点,可以使用:
echo "$old ${new%.}"
朴素的版本(与点相呼应)与 Bourne shell 以及衍生物一起使用;具有 Korn shell 和衍生工具的唯一工作人员的版本${new%.}- 不是原始的 Bourne shell。
如果必须使用临时文件,则使它们的名称包含进程 ID ($$) 并使用陷阱删除它们:
tmp=${TMPDIR:-/tmp}/bigram.$$
trap 'rm -f $tmp.?; exit 1' 0 1 2 3 13 15
...code using $tmp.1, $tmp.2, etc...
rm -f $tmp.?
trap 0
信号1为挂断(HUP),2为中断(INT),3为退出(QUIT),13为管道(PIPE),15为终止(TERM);0 是“任何出口”,在这种情况下几乎是 juju。在真正退出之前,记得取消退出陷阱,如图。