Все это хорошо, но seq предположительно устарел, и большинство из них работают только с числовыми диапазонами.
Если вы заключите цикл for в двойные кавычки, стартовые и конечные переменные будут разыменованы, когда вы будете эхо-строки , и вы можете отправить строку обратно в BASH для выполнения. $i
должен быть экранирован, поэтому он НЕ оценивается перед отправкой на подоболочку.
RANGE_START=a
RANGE_END=z
echo -e "for i in {$RANGE_START..$RANGE_END}; do echo \\${i}; done" | bash
Этот вывод также может быть назначен переменной:
VAR=`echo -e "for i in {$RANGE_START..$RANGE_END}; do echo \\${i}; done" | bash`
Единственный «служебный» ресурс, который должен генерировать, должен быть вторым экземпляром bash, поэтому он должен быть подходящим для интенсивных операций.
РЕДАКТИРОВАТЬ: Этот ответ устарел. Используйте решение ниже ...
Используйте задачу ReadLinesFromFile, чтобы получить строку замены из файла xy.xml. Отметьте
Затем используйте значение из xy.xml в качестве строки замены для задачи FileUpdate. Отметьте
И соберите все вместе;)
Это больше не требуется ... теперь вы можете вставить C # в файл проекта / сборки ...
Определите пользовательскую задачу и параметры следующим образом:
<UsingTask TaskName="ReplaceFileText" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<InputFilename ParameterType="System.String" Required="true" />
<OutputFilename ParameterType="System.String" Required="true" />
<MatchExpression ParameterType="System.String" Required="true" />
<ReplacementText ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Reference Include="System.Core" />
<Using Namespace="System" />
<Using Namespace="System.IO" />
<Using Namespace="System.Text.RegularExpressions" />
<Code Type="Fragment" Language="cs">
<![CDATA[
File.WriteAllText(
OutputFilename,
Regex.Replace(File.ReadAllText(InputFilename), MatchExpression, ReplacementText)
);
]]>
</Code>
</Task>
</UsingTask>
Затем просто назовите ее как любую другую задачу MSBuild
<Target Name="AfterBuild">
<ReplaceFileText
InputFilename="$(OutputPath)File.exe.config"
OutputFilename="$(OutputPath)File.exe.config"
MatchExpression="\$version\$"
ReplacementText="1.0.0.2" />
</Target>
В приведенном выше примере «$ version $» заменяется на « 1.0.0.2 "в" File.exe.config ", расположенном в выходном каталоге.
Вы можете использовать задачу FileUpdate из Задач сообщества MSBuild, как описано в статье http://geekswithblogs.net/mnf/archive/2009/07/03/msbuild-task-to-replace-content-in -text-files.aspx
Я запустил обе замены для одного и того же файла, который находится на диске Unix, и использовал путь unc к нему \ server \ path ...:
<ReplaceFileText
InputFilename="$(fileToUpdate)"
OutputFilename="$(fileToUpdate)"
MatchExpression="15.0.0"
ReplacementText="15.3.1"/>
<FileUpdate Files="$(fileToUpdate2)"
Regex="15.0.0"
ReplacementText="15.3.1" />
, а пользовательское действие cs выше не добавляет бомба; однако FileUpdate сделал:
%head -2 branding.h branding2.h
==> branding.h <==
#/* branding.h
#** This file captures common branding strings in a format usable by both sed and C-preprocessor.
==> branding2.h <==
#/* branding.h
#** This file captures common branding strings in a format usable by both sed and C-preprocessor.
Спасибо csharptest.net - я делал exec с командами perl subtitute для сборок unix.