2009-10-31 72 views
0

我編寫了此腳本來計算給定文件中特定模式的出現次數。但是,如果文本文件包含方括號或大括號,shell會輸出消息「Missing}」。下面是該腳本:用於計算匹配模式C shell的單詞的腳本

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

回答

3

你需要引用的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貝殼更適合腳本。如果你想確保你的代碼是可移植的,請去dash。如果您需要更多的權力,請使用bash,kshzsh

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

sh$ echo "foo \"bar\" \$ dollar" 
foo "bar" $ dollar 
+0

這正是我需要克里斯。我試圖通過使用for循環將每行分割成一個字線來實現這一點,而不是使用egrep,但tr命令似乎更容易。這是我的第一個腳本,不幸的是我必須使用C shell,因爲這是他們在uni上使用的腳本。將來我肯定會轉向bash或korn。 – Mike55

+1

即使您的登錄shell是'csh',您仍然可以使用其他shell /語言編寫腳本。如果你沒有被告知你必須使用'csh'作爲腳本,那麼你應該能夠在過去二十年中安裝的任何Unix-oid系統上找到一個Bourne shell作爲'/ bin/sh'。如果出於任何原因,最終會在'csh'中寫入腳本,請查看我包含在我的答案中的鏈接,它可以幫助您避免出現問題的地方和/或幫助您避免受到「 csh'。 –

+0

他們要求我們在C shell中編寫所有腳本,因爲講義是爲C編寫的,但是我們需要解釋需要更改哪些代碼才能使其在bash上工作。 – Mike55