2

Моя среда:

Я работаю с интерпретатором команд в Windows.

Я использую sh.exe, который поставляется с некоторыми проприетарными инструментами, которые я установил. Я не знаю деталей этого sh.exe, но вот что я получаю при запросе его версии:

>sh.exe --version
GNU bash, version 3.1.23(1)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.

Точно так же вот что я имею для sed:

>sed --version
GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-gnu-utils@gnu.org>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.

Что я после:

Я хотел бы иметь возможность использовать команду sed, которая соответствует для равного символа и сделать это из сценария оболочки.

Это работает как ожидалось:

>echo "a=b" | sed "s/a=//"
"b"

Если parse_trace.sh содержит

#!/bin/sh

sed "s/a//"

Я также получаю то, что ожидаю:

>echo "a=b" | sh parse_trace.sh
"=b"

Однако заменив последнюю строку моего скрипта на:

sed "s/a=//"

приводит к

>echo "a=b" | sh parse_trace.sh
sed.exe: -e expression #1, char 5: unterminated `s' command

И если я использую вместо

sed "s/a\=//"

я получил

>echo "a=b" | sh parse_trace.sh
"==b"

Что мне не хватает?

Обновить

Знак = правильно интерпретируется в моем сценарии оболочки, если это не последний символ в шаблоне. Т.е. если моя последняя строка в скрипте сейчас:

sed "s/a=b//"

Тогда я получаю:

echo "a=b" | sh parse_trace.sh
""

echo "a=bc" | sh parse_trace.sh
"c"

Так что в =/ есть что-то, что заставляет комбо DOS-SHELL как-то не работать.

Обновление 2

>od -Ax -tx1z parse_trace.sh
000000 23 21 2f 62 69 6e 2f 73 68 0a 0a 73 65 64 20 22  >#!/bin/sh..sed "<
000010 73 2f 61 5c 3d 2f 2f 22 0a 0a                    >s/a\=//"..<
00001a

>echo "a=b" | sh -x parse_trace.sh
+ sed 's/a\=//'
"==b"

>od -Ax -tx1z parse_trace.sh
000000 23 21 2f 62 69 6e 2f 73 68 0a 0a 73 65 64 20 22  >#!/bin/sh..sed "<
000010 73 2f 61 3d 2f 2f 22 0a 0a                       >s/a=//"..<
000019

>echo "a=b" | sh -x parse_trace.sh
+ sed s/a=//
sed.exe: -e expression #1, char 5: unterminated `s' command

1 ответ1

0

Я не уверен, что это будет работать, но я думаю, что это хороший выстрел:

sed 's,a\x3d,,'

Я попробовал это в моей среде, это работает. Причиной возникновения такой ситуации могут быть две вещи:
а. Используемый sh и cmd вместе обрабатывают '/' и '\' как разделитель sed.
б. Вы используете двойные кавычки, которые bash попытается найти уравнение и переменные внутри него.

Я сам часто использую cmd в сочетании с командами оболочки, я бы порекомендовал вам попробовать cygwin. Добавьте путь к корзине Cygin в PATH из окон, будет работать как шарм. Но вы должны быть осторожны с ESCAPE.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .