Как решить ошибку "Word too long" в unix?

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

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 fish foot foox house mouse

Вот вывод, который я получаю:

fish

feet

foox: word not found in dictionary.

Word too long.

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

Спасибо.

4 ответа

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

Шаг 1:

sudo apt-get install tcsh

Шаг 2:

sudo update-alternatives --config csh

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

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

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

Я просто столкнулся с этой же проблемой, и это было результатом расширения переменной оболочки, которая была "слишком длинной". Я также использовал grep, как это:

set test_error = "grep -P '^UVM_(ERROR|FATAL)\s+[^:]' $mylog"

... который совпал с несколькими строками в $ mylog и стал $ test_error огромной многострочной строкой. Исправление состояло в том, чтобы использовать "-m 1" для остановки grep после первого совпадения, например так:

set test_error = "grep -P -m 1 '^UVM_(ERROR|FATAL)\s+[^:]' $mylog"

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

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

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

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

env | grep VARIABLE_NAME

и / или

set | grep VARIABLE_NAME

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

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

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

или используя awk, как прокомментировал технозавр.

Другие вопросы по тегам