使用awk进行条件查找/替换

时间:2011-10-23 07:14:06

标签: bash sed awk hunspell spell-checking

我想解决一个常见但非常具体的问题:由于OCR错误,许多字幕文件包含字符“I”(大写字母i)而不是“l”(小写字母L)。

我的攻击计划是:

  1. 逐字处理文件
  2. 将每个单词传递给hunspell拼写检查器(“echo the-word | hunspell -l”如果有效则不会产生任何响应,如果有效则不会产生响应)
  3. 如果它是一个坏词,并且它中有大写的Is,那么用小写l替换它们并再试一次。如果它现在是有效单词,请替换原始单词。
  4. 我当然可以在脚本中对整个文件进行标记和重构,但在我走这条路之前,我想知道是否可以在字级使用awk和/或sed进行这些类型的条件操作?

    任何其他建议的方法也将非常受欢迎!

2 个答案:

答案 0 :(得分:2)

你真的不需要为此而烦恼:

while read line; do
  words=( $line )
  for ((i=0; i<${#words[@]}; i++)); do
    word=${words[$i]}
    if [[ $(hunspell -l <<< $word) ]]; then
      # hunspell had some output
      tmp=${word//I/l}
      if [[ $tmp != $word ]] && [[ -z $(hunspell -l <<< $tmp) ]]; then
        # no output for new word, therefore it's a dictionary word
        words[$i]=$tmp
      fi
    fi
  done
  # print the new line
  echo "${words[@]}"
done < filename > filename.new

将整个文件传递给hunspell似乎更有意义,并解析其输出。

答案 1 :(得分:1)

两个建议:

  1. 将问题更靠近原点,即靠近OCR软件。是否可以查阅字典,甚至不提出包含“我”的非单词?如果没有,请尝试不同的OCR程序。
  2. 通过hunspell运行每个单词会为每个单词创建一个进程,这是一个大量浪费CPU周期。 尝试使用多个传递,其中第一个传递找到所有'I'字,然后过滤掉正确的单词,然后替换每个可校正的单词。