Грамматика оболочки распознает слова присваивания на этапе лексирования , задолго до расширения параметров. Хотя у вас может быть параметр, расширяемый до команды , вы не можете расширять его до назначения — в этот момент он просто обрабатывается как команда, даже если он текстуально один и тот же (, это похоже на вас. написал"SLS_DEBUG=*" sls...
).
Это странность синтаксического анализа и оценки языка команд оболочки. Определенные виды поведения определяются лексически при первом считывании кода, и эти поведения никогда не могут быть восстановлены позже, даже несмотря на то, что обычно кажется, что работает текстовая замена.
Вы можете использовать SLS_DEBUG_TEXT="eval SLS_DEBUG='*' "
, и это будет работать, хотя и с потенциальными проблемами, если оставшаяся часть команды когда-либо может содержать какие-либо метасимволы оболочки. Другой вариант — вместо этого условно определить функцию :
.
sls_debug() { :; }
if [ "$ENABLE_DEBUG_LOGGING" = "true" ]; then
sls_debug() {
SLS_DEBUG='*' "$@"
}
fi
sls_debug sls create_domain...
В качестве альтернативы (и, возможно, более понятной )функция, которая просто проверяет $ENABLE_DEBUG_LOGGING
внутри, также будет работать, или env "$SLS_DEBUG_TEXT"...
или eval "$SLS_DEBUG_TEXT"...
также будут явными.
С помощью sed
вы можете собрать имена файлов в резервном пространстве, а затем для всех строк в results.txt
проверить совпадения, чтобы отфильтровать, какие строки следует изменить:
sed -e '1,/^$/{H;1h;d;}' -e 'G;/^>\(.*\).*\n\1\n/s_^>_>h-19/US/CA-_;P;d' filename.txt <((echo)) results.txt
<((echo))
между файлами, поэтому 1,/^$/
адресует все строки первого файла (и пустую строку)H;1h;d
(1h
позволяет избежать запуска пробела с новой строки)G
добавляет пробел ко всем строкам result.txt
, а /^>\(.*\).*\n\1\n/
соответствует тем строкам, которые начинаются с >
и строке, которая представляет собой имя файла (, заключенное в новые строки в пробеле)s_^>_>h-19/US/CA-_
заменяет эти строки P;d
печатает только первую строку без добавленного мусора.Вы могли бы сделать s/\n.*//
вместо Используйте perl
для редактирования на месте во входном файле:
pfx='h-19/US/CA-' \
perl -pi -e '
BEGIN { %h = map { tr/\n//dr => $ENV{pfx}} <STDIN>}
s/^>\K(?=(.*))/$h{$1}/;
' results.txt < filename.txt