你的回答不能滿足您的要求「開頭爲」。聽起來像sed
真的是最好的工具。您可以獲得GnuWin32 sed.exe
並使用它來執行替換。順便說一句,在你的問題是shell腳本可以通過允許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);
如果要替換的字符串始終是兩個字母后跟數字,那麼我建議用/^(md|cl|cm)(?=\d)/ig
替換上面的正則表達式,以查找(但不包括)數字作爲該行的第三個字符。
你在JavaScript有多好?如果你對JavaScript感到滿意,你會(希望)發現JScript易於遵循並根據需要進行維護。
有一個名爲'sed'的工具,另一個名爲'awk',都可以做你想做的事情。 – MondKin
另外,考慮顯示你已經嘗試。 – MondKin
以及我需要在Windows批處理中運行此操作。在Linux中,我用sed做了它,並且將新條目追加到文件末尾。 –