2014-01-04 1 views
0

Я пишу сценарий оболочки TC, называемый pl_dict в unix, который принимает список английских слов в единственной форме в качестве входных данных и выводит множественную форму каждого слова в отдельной строке. Он использует файл, содержащий список слов на английском языке и другую программу c, которая принимает английское слово в единственной форме в качестве аргумента и печатает множественную форму слова. Вот мой код:Как решить ошибку «Слово слишком долго» в unix?

set dictionary = (/usr/share/dict/words) 

set irregular = (/share/files/irregular.txt) 

#go over all the input words 

foreach word ($argv[*]) 

    set irregularWord = `grep $word $irregular | cut -d" " -f1` 

    #the word is found in irregular.txt file 
    if ("$irregularWord" != "") then 
     gcc -o pluralize pluralize.c 
     ./pluralize -f irregular.txt $word 

    else #the word is not found in the irregular file 

     #search for it in the dictionary 
     set realEnglishWord = `grep $word $dictionary` 

     #the word is a real English word 
     if ("$realEnglishWord" != "") then 
      gcc -o pluralize pluralize.c 
      ./pluralize $word 
     else 
      echo "$word":" word not found in dictionary." 
     endif 
    endif 
end 

Это прекрасно работает, пока я пытаюсь запустить это: pl_dict рыба нога foox домовой мыши

Вот вывод я получаю:

fish 

feet 

foox: word not found in dictionary. 

Word too long. 

Что такое проблема и как я могу ее исправить?

спасибо.

+1

Попробуйте несколько отладочных эхо-сигналов, чтобы узнать, что такое $ word ... grep может соответствовать нескольким строкам из словаря ... Если это так, вы можете использовать awk и выполнить точное соответствие $ 1 – technosaurus

ответ

0

Я полагаю, что это сообщение программы pluralize, и нам нужен текст программы, который поможет вам.

Кроме того, вам не нужно скомпилировать программу каждый раз, когда вы запускаете скрипт (gcc). Вы можете сделать это один раз, а затем использовать двоичный файл.

0

Перед tcsh 6.15 существует ограничение на максимальную длину на линию. Если я правильно помню, это 4K символов. Сообщение отображается, если ограничение нарушено.

Это часто связано с тем, что оболочка расширяет длинную переменную. Я столкнулся с этой проблемой, когда попытался расширить сложную $ PATH дважды в одной строке.

Чтобы решить эту проблему, сначала найдите длинную переменную. Использование

env | grep VARIABLE_NAME 

и/или

set | grep VARIABLE_NAME 

перед подстановкой переменных, чтобы проверить предполагаемую переменную.

Кроме того, так как результат grep может быть тысячи строк (например, is), если вы хотите точный результат, вы можете использовать <> указать граничные

grep "\<WORD\>" /usr/share/dict/words 

или с использованием AWK, так как прокомментировал technosaurus.

0

Я просто ударил эту же проблему, и это было результатом расширения переменной оболочки, которая была «слишком длинной». Я также использую Grep следующим образом:

набор test_error = «grep -P '^UVM_(ERROR|FATAL)\s+[^:]' $mylog»

... который соответствие нескольких строк в $ MyLog и вызывая $ test_error стать огромной строкой многострочных. Исправление заключается в использовании «-m 1», чтобы вызвать Grep, чтобы остановить после первого матча, как это:

набор test_error = «grep -P -m 1 '^UVM_(ERROR|FATAL)\s+[^:]' $mylog»

В моем приложении я нужен только первый матч.Не уверен, что это применимо к вашему использованию.

3

Попробуйте следующие шаги:

Шаг 1:

sudo apt-get install tcsh 

Шаг 2:

sudo update-alternatives --config csh 

Выберите Tcsh из списка доступных вариантов.