Вашего ответ не соответствует вашей «строке, начинающейся с» требованием. Похоже, sed
действительно был бы лучшим инструментом для работы. Вы можете получить GnuWin32 sed.exe
и использовать это для выполнения своих замен. Кстати, что сценарий оболочки в вашем вопросе может быть сокращен до одной строки, позволяя sed
читать и изменять файлы встраивать как это:
sed -i -r -e '/^CLM/! s/^CL/CYLK/ig' -e 's/^CM/CLMR/ig' -e 's/^MD/MADX/ig' *.db
(Если вы хотите использовать эту строку в Windows, заменить одиночные кавычки с двойным, чтобы предотвратить cmd
от интерпретации карат, как экранирующие символы.)
Если вы не хотите использовать gnuwin32 sed
, то понимают, что поддержка регулярных выражений в пакете Windows, является довольно слабой. Есть findstr
, но он поддерживает только самое основное соответствие регулярному выражению и не выполняет замены. (Это похоже на очень слабый grep
.)
Если вы хотите решение, которое вы можете придерживаться в .bat
файл и запустить его, то я предлагаю пакетный/JScript гибридный сценарий, что-то вроде этого:
@if (@[email protected]) @end /* begin JScript hybrid multiline comment
:: batch portion
@echo off
setlocal
for %%I in (*.db) do (
cscript /nologo /e:JScript "%~f0" "%%~I"
)
goto :EOF
:: end batch/begin JScript */
var fso = new ActiveXObject('scripting.filesystemobject'),
forReading = 1,
dbFile = WSH.Arguments(0),
oldFile = dbFile.replace(/\.\w+$/, '.old');
fso.MoveFile(dbFile, oldFile);
var reader = fso.OpenTextFile(oldFile, forReading),
writer = fso.CreateTextFile(dbFile);
while (!reader.AtEndOfStream) {
var line = reader.ReadLine();
writer.WriteLine(line.replace(
/^(md|cl|cm)(?!mx|mr)/ig,
function(match, $1) {
return {
md: 'MADR',
cl: 'CYLR',
cm: 'CLMR'
}[$1.toLowerCase()];
} // end function
)); // end replace() and WriteLine()
} // end while
reader.Close();
writer.Close();
// uncomment if you don't wish to keep backup as .old
// fso.DeleteFile(oldFile);
Если строки, которые вы хотите заменить, всегда являются двумя альфа-символами, за которыми следуют цифры, тогда я предлагаю заменить regexp выше на /^(md|cl|cm)(?=\d)/ig
, чтобы смотреть вперед (но не включать) число в качестве третьего символа строки.
Насколько вы владелец? Если вам нравится JavaScript, вы (надеюсь) найдете, что JScript легко отслеживать и поддерживать по мере необходимости.
Существует инструмент под названием 'sed', а другой -' awk', оба могут делать то, что вы хотите. – MondKin
Также подумайте о том, что вы уже пытаетесь. – MondKin
Ну, мне нужно запустить это в пакетном режиме Windows. в linux я сделал это с sed, и я добавляю новые записи в конец файла. –