Почему sed дает мне ошибку о незавершенном'?

Ваш PATH плохо. Это имеет системные каталоги Windows перед каталогами Cygwin или возможно не имеет каталогов Cygwin вообще. Это сообщение прибывает из команды Windows find (что это сообщает о своем имени как FIND в верхнем регистре подсказка).

При запуске оболочки Cygwin обычно необходимо устанавливать PATH. Я рекомендую запустить оболочку входа в систему (если я вспоминаю правильно, это - то, что записи системного меню Cygwin по умолчанию делают). Ваш Cygwin PATH должен иметь /usr/local/bin, /usr/bin и /bin (по крайней мере), перед любым non-Cygwin каталогом.

8
11.05.2013, 02:17
4 ответа

Вы не можете безопасно интерполировать переменную в команде 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
4
27.01.2020, 20:11
  • 1
    Тривиальное примечание: - a -v потребности предшествовать каждому объявлению переменной. –  Mike B 06.02.2014, 08:01
  • 2
    @MikeB спасибо за отчет об ошибках. В целом отредактируйте сообщение непосредственно при нахождении опечаток как это. –  Gilles 'SO- stop being evil' 06.02.2014, 12:13
  • 3
    @Gilles от неавторов должны быть по крайней мере шестью символами. –  NobleUplift 07.02.2014, 00:09

Скорее всего, один из Вашего $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 как запаздывающая наклонная черта.

6
27.01.2020, 20:11

Как другие упомянули здесь, это зависит от содержания Вашего НЕЧТО* переменные. В Вашем случае, с помощью 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
2
27.01.2020, 20:11

Для меня проблема была решена путем добавления дополнительных обратных косых черт в команде 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
1
27.01.2020, 20:11

Теги

Похожие вопросы