Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用awk进行条件查找/替换_Bash_Sed_Awk_Hunspell_Spell Checking - Fatal编程技术网

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

Bash 使用awk进行条件查找/替换,bash,sed,awk,hunspell,spell-checking,Bash,Sed,Awk,Hunspell,Spell Checking,我想解决一个常见但非常具体的问题:由于OCR错误,许多字幕文件包含字符“I”(大写I)而不是“l”(小写l) 我的攻击计划是: 逐字处理文件 将每个单词传递给拼写检查器(“回显单词| hunspell-l”如果有效则完全不产生响应,如果不正确则产生响应) 如果它是一个不好的单词,并且其中包含大写字母,则将其替换为小写字母l,然后重试。如果它现在是有效单词,请替换原始单词 我当然可以在脚本中标记和重建整个文件,但在我走这条路之前,我想知道是否可以在字级别使用awk和/或sed进行这些条件操作 任何

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

我的攻击计划是:

  • 逐字处理文件
  • 将每个单词传递给拼写检查器(“回显单词| hunspell-l”如果有效则完全不产生响应,如果不正确则产生响应)
  • 如果它是一个不好的单词,并且其中包含大写字母,则将其替换为小写字母l,然后重试。如果它现在是有效单词,请替换原始单词
  • 我当然可以在脚本中标记和重建整个文件,但在我走这条路之前,我想知道是否可以在字级别使用awk和/或sed进行这些条件操作

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

    两个建议:

  • 将问题修复到更靠近其来源的位置,即OCR软件附近。能不能让人们查字典,甚至不找出包含“I”的非单词?如果没有,请尝试另一种可能的OCR程序
  • 通过拼音运行每个单词会为每个单词创建一个进程,这是对CPU周期的巨大浪费。尝试使用几个过程,第一个过程找到所有“I”字,然后过滤出正确的字,然后替换每个可更正的字
  • 两项建议:

  • 将问题修复到更靠近其来源的位置,即OCR软件附近。能不能让人们查字典,甚至不找出包含“I”的非单词?如果没有,请尝试另一种可能的OCR程序
  • 通过拼音运行每个单词会为每个单词创建一个进程,这是对CPU周期的巨大浪费。尝试使用几个过程,第一个过程找到所有“I”字,然后过滤出正确的字,然后替换每个可更正的字

  • 您不需要比bash更多的东西:

    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
    
    读行时
    ;做
    单词=($line)
    
    对于((i=0;i您不需要比bash更多的东西来实现这一点:

    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
    
    读取行时;执行以下操作
    单词=($line)
    
    对于((i=0;iHi@glenn!+1!哈,哈!我不知道hunspell处理的标点符号,我将删除我的帖子:)这就是我在bash中所做的,尽管我在做第一个hunspell测试之前先检查了“i”的存在。然后又做了两个hunspell通过:第二个是所有“i”s替换为l,第三个替换为除第一个“I”之外的所有“I”替换为l(用于“傻瓜”之类的词)。这产生了一个足以满足我需求的解决方案,尽管它在处理器方面非常密集-一个120KB的文件在i7-920上处理大约需要2分钟。如果没有更有效的解决方案,我当然会接受。更有效的解决方案是类似
    hunspell-options file |解析输出>新建|ile
    --只需生成hunspell一次,而不是为文件中的每个单词生成一次。嗨@glenn!+1!哈,哈!我不知道hunspell处理标点符号,我将删除我的帖子:)这几乎就是我在bash中完成的操作,尽管我检查了是否存在“I”第一次是在做第一次拼写测试之前。然后又做了两次拼写测试:第二次是用l代替所有的“I”,第三次是用l代替所有的“I”(除了第一个“I”)(用于像“白痴”这样的词)。这产生了一个足以满足我需求的解决方案,尽管它在处理器方面非常密集-一个120KB的文件在i7-920上处理大约需要2分钟。如果没有更有效的解决方案,我当然会接受。更有效的解决方案是类似
    hunspell-options file |解析输出>新建|ile
    --只需生成一次hunspell,而不是文件中的每个单词都生成一次hunspell。感谢您提供的提示。关于(1)您肯定是对的,但不幸的是,我只能使用生成的.SRT文件。通过将hunspell仅用于包含“I”的单词,我使(2)稍微好了一些,但你是对的,它的计算成本仍然很高。我将调查是否可以将整个文件的输出与原始文件进行协调。感谢你提供的提示。关于(1)你肯定是对的,但不幸的是,我只需要处理生成的.SRT文件。我制作了(2)通过限制hunspell仅用于包含“I”的单词,效果会稍微好一些,但您是对的,它仍然需要大量的计算。我将研究是否可以将整个文件的hunspell输出与原始文件进行协调。