【问题标题】:Script to count words matching pattern C shell计算与模式 C shell 匹配的单词的脚本
【发布时间】:2009-10-31 12:37:30
【问题描述】:

我编写了这个脚本,它计算给定文件中特定模式的出现次数。但是,如果文本文件包含方括号或花括号,shell 会输出消息“Missing }”。这是脚本:

#!/bin/csh
@ count=0
   foreach word ( `cat test` )
    if (`echo $word | egrep -c 'int'`) then
      @ count= $count + 1
    endif
   end
echo $count

【问题讨论】:

    标签: shell


    【解决方案1】:

    你需要引用word的扩展:echo "$word"

    如果您只想在一行中计算多次出现(因为grep -c 只计算至少有一个匹配的行),请使用tr 将普通空格更改为换行符(然后您 可以使用grep -c):

    (tr ' \t' '\n\n' | fgrep -c int) < test
    

    另外,scripting csh is usually going to cause more problems than it is worth。尽管有自己的历史怪癖,但 Bourne shell 更适合编写脚本。如果您想确保您的代码是可移植的,请使用dash。如果您需要更多电源,请使用 bashkshzsh

    csh% echo "foo \"bar\" \$ dollar"
    csh: Unmatched ".
    
    sh$ echo "foo \"bar\" \$ dollar"
    foo "bar" $ dollar
    

    【讨论】:

    • 这正是我需要的克里斯。我试图通过使用 for 循环将每一行分成一个字行来实现这一点,而不是使用 egrep,但 tr 命令似乎要容易得多。这是我的第一个脚本,不幸的是我必须使用 C shell,因为这是他们在 uni 使用的。将来我肯定会改用 bash 或 korn。
    • 即使您的登录 shell 是 csh,您仍然可以使用其他 shell/语言编写脚本。如果您没有被告知必须将csh 用于脚本,那么您应该能够在过去两年安装的任何Unix-oid 系统上找到/bin/sh 的Bourne shell。如果由于某种原因,您最终无法在 csh 中编写脚本,请查看我在答案中包含的链接,它可以帮助您避免问题区域和/或帮助您避免被 @ 中完全不可能的事情所困扰987654338@.
    • 他们要求我们在 C shell 中编写所有脚本,因为讲义是为 C 编写的,但是我们需要解释需要更改哪些代码才能使其在 bash 上运行。
    猜你喜欢
    • 1970-01-01
    • 2019-01-22
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多