Я наткнулся на то, что, по моему мнению, является ответом на этот вопрос: команда envsubst
.
envsubst < something.txt
Если он еще не доступен в вашем дистрибутиве, он находится в
gettext
. @Rockallite - я написал небольшой скрипт-оболочку, чтобы позаботиться о проблеме «\ $».
(Кстати, есть функция "envsubst, объясненный в https://unix.stackexchange.com/a/294400/7088 для расширения только некоторых переменных на входе, но я согласен, что избежать исключений гораздо удобнее .)
Вот мой скрипт:
#! /bin/bash
## -*-Shell-Script-*-
CmdName=${0##*/}
Usage="usage: $CmdName runs envsubst, but allows '\$' to keep variables from
being expanded.
With option -sl '\$' keeps the back-slash.
Default is to replace '\$' with '$'
"
if [[ $1 = -h ]] ;then echo -e >&2 "$Usage" ; exit 1 ;fi
if [[ $1 = -sl ]] ;then sl='\' ; shift ;fi
sed 's/\\\$/\${EnVsUbDolR}/g' | EnVsUbDolR=$sl\$ envsubst "$@"
Обновление: Я думаю, что мой вопрос был плохо сформулирован. То, что я хотел сделать, это создать spring
Я нашел очень хорошее объяснение того, как это сделать в старой документации Spring и применил его к новому Spring 3.0 MVC. В основном это означает, что вам нужно зарегистрировать PropertyEditor в методе @InitBinder вашего контроллера. После этого все будет работать как ожидается (при условии, что вы добавили MultiPartResolver в контекст и установили правильную кодировку формы). Вот мой пример:
@RequestMapping("/scriptfile/**")
@Controller
public class ScriptFileController {
//we need a special property-editor that knows how to bind the data
//from the request to a byte[]
@InitBinder
public void initBinder(WebDataBinder binder)
{
binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
}
@RequestMapping(value = "/scriptfile", method = RequestMethod.POST)
public String create(@Valid ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {
if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");
if (result.hasErrors()) {
modelMap.addAttribute("scriptFile", scriptFile);
modelMap.addAttribute("showcases", ShowCase.findAllShowCases());
return "scriptfile/create";
}
scriptFile.persist();
return "redirect:/scriptfile/" + scriptFile.getId();
}
}
Я не верю, что вы можете комбинировать загрузки файлов с обычными формами (по крайней мере, в Spring MVC), потому что формы загрузки файлов используют multipart / form-data
вместо обычного application / x-www-form-urlencoded
.
Когда вы указываете multipart / form-data
, тогда в Spring вам нужно использовать реализацию MultipartResolver
(как указано в документах Spring, на которые вы ссылаетесь) и декодирование всех параметров должен пройти через это. Spring MVC не сможет декодировать входные данные нормальной формы, поскольку все поля будут закодированы вместе с загруженным файлом.
Почти наверняка проще использовать две отдельные формы, одну для обычных вещей, а другую для загрузки файлов.
Если вы используете Spring 3.0, вы можете создать Converter и Formatter (необязательно). Вам не придется использовать метод initBinder и оставить вещи больше POJO, но ваше решение все еще очень актуально и все еще довольно чистое.
См. https://jira.springsource.org/browse/ROO-442 для связанного вопроса Roo.