При ошибке «неоднозначного перенаправления»
Ошибка «неоднозначного перенаправления» вовсе не sed
, а из вашей оболочки.
«Неоднозначное перенаправление»ошибка означает, что ваша оболочка вообще не может запустить команду, которую вы ей дали, потому что она не смогла выполнить перенаправления, запрошенные как часть среды этой команды.
В этом случае переменная rns
равнапусто.
Это потому, что rns= echo $r | sed 's/ //g'
не присваивает rns
выходу sed
на всех . Вместо этого он присваивает временную переменную среды с именем rns
пустой строкой, только на время выполнения echo $r
(выходные данные которого отправляются на sed
, а оттуда настандартный сценарий).
Вместо этого используйте:
rns=${r//[[:space:]]/}
... или, менее эффективно:
rns=$(sed -e 's/ //g' <<<"$r")
Чтобы избежать той же ошибки в случаях, когдапеременная не пуста, не забудьте процитировать!
То есть вместо выполнения ... >$file
всегда выполняйте ... >"$file"
, чтобы гарантировать, что нежелательное расщепление строк или расширение глобуса можетне сделать перенаправление, действующее в противном случае, неработоспособным. (Это не происходит со всеми версиями оболочки, но это означает, что неудачное цитирование приводит к непредсказуемости поведения вашего кода, если вы не знаете, с какой версией оболочки он будет работать!).
Вклошибка «неизвестная опция»
Если вы используете /
в качестве разделяющих сигил частей вашей команды sed
, то у вас не должно быть никаких /
s в заменяемых данных . Если вы не можете гарантировать это, используйте другой символ вместо /
;например, s@/foo/bar@/baz/qux@
работает правильно.