Ваш PATH
плохо. Это имеет системные каталоги Windows перед каталогами Cygwin или возможно не имеет каталогов Cygwin вообще. Это сообщение прибывает из команды Windows find
(что это сообщает о своем имени как FIND
в верхнем регистре подсказка).
При запуске оболочки Cygwin обычно необходимо устанавливать PATH
. Я рекомендую запустить оболочку входа в систему (если я вспоминаю правильно, это - то, что записи системного меню Cygwin по умолчанию делают). Ваш Cygwin PATH
должен иметь /usr/local/bin
, /usr/bin
и /bin
(по крайней мере), перед любым non-Cygwin каталогом.
Вы не можете безопасно интерполировать переменную в команде sed, потому что замена выполняется оболочкой, не sed. Значение переменной становится sed синтаксисом. Например, в "s/TMPFOO1/$FOO1/"
, если $FOO1
содержит новую строку, это вызовет синтаксическую ошибку как та, которую Вы наблюдали. Если $FOO1
содержит a /
, это завершается s
управляйте и может вызвать ошибку или может заставить другие команды выполняться (если, что после /
оказывается, допустимый sed синтаксис).
В то время как можно сделать первичную обработку замены FOO1
для заключения в кавычки его специальных символов для включения в это команда sed намного более просто использовать awk. Awk имеет понятие переменной и синтаксис командной строки для устанавливания начального значения переменной.
awk -v FOO1="$FOO1" -v FOO2="$FOO2" -v FOO3="$FOO3" -v FOO4="$FOO4" -v FOO5="$FOO5" '{
sub(/TMPFOO1/, FOO1);
sub(/TMPFOO2/, FOO2);
sub(/TMPFOO3/, FOO3);
sub(/TMPFOO4/, FOO4);
sub(/TMPFOO5/, FOO5);
print;
}' /home/foo/template > /home/foo/template/finishedresult
Скорее всего, один из Вашего $FOO
переменные содержат специальные символы, которые интерпретируются sed
.
У меня есть другая версия sed
который генерирует другие сообщения об ошибках, но здесь является примером подобной проблемы:
$ VAR=a
$ echo i | sed -e "s/i/"$VAR"/"
a
$ tmp> VAR=/
$ echo i | sed -e "s/i/"$VAR"/"
sed: 1: "s/i///
": bad flag in substitute command: '/'
В этом случае $VAR
содержит символ, который интерпретируется sed
как запаздывающая наклонная черта.
Как другие упомянули здесь, это зависит от содержания Вашего НЕЧТО* переменные. В Вашем случае, с помощью sed
неправильный выбор, потому что он, вероятно, содержит некоторые специальные символы.
Смотрите на эту ссылку и посмотрите функцию gsub_literal
С тех пор gsub_literal
чтения от stdin и записей к stdout, использование будет:
gsub_literal "$search" "$replace" < /home/foo/template > /home/foo/template/finishedresult
Демонстрационный вывод:
rany$ cat > foo.txt
a'
a'
rany$ gsub_literal a\' b < foo.txt
b
b
Для меня проблема была решена путем добавления дополнительных обратных косых черт в команде sed 's /.../.../ g'
. Эта команда
sed 's/\"a/ä/g' input_file
дала мне это сообщение об ошибке
sed: -e выражение # 1, char 9: unterminated `s 'command
, когда она выполнялась как часть сценария c-shell, и это было только с последней версией sed
, а не с более старой версией. (Как ни странно, эта же команда отлично работает, когда она вводится в командной строке (в tc-shell)).
Проблема со сценарием c-shell была устранена путем установки перед символом ä
обратной косой черты:
sed 's/\"a/\ä/g' input_file
-v
потребности предшествовать каждому объявлению переменной. – Mike B 06.02.2014, 08:01