Используйте регулярное выражение для замены в партии - PullRequest
2 голосов
/ 11 марта 2020

Я просто хочу добавить одну цитату ко всем датам в файле пакетным скриптом. 2006/04/26 20:24:26 → '2006/04/26 20:24:26' По какой-то причине мне пришлось использовать регулярное выражение.

Я пытался использовать findstr в пакете, на самом деле это не так работа.
SET "REGEX=[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]" Я думаю, я должен использовать PowerShell или VBS, чтобы сделать это. Но я не знаком ни с powershell, ни с vbs, меня немного смущают примеры кодов.

Доза, у кого-нибудь есть какая-то подсказка?

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Решение с использованием Regex в vbscript с командным файлом:

@echo off
Title Replace String using Regex with vbscript
Set "InputFile=%1"
If "%~x1" NEQ ".txt" Goto :Help
Set "OutPutFile=%~dp0OutPutFile.txt"
Call :Search_Replace "%InputFile%" "%OutPutFile%"
Start "" "%OutPutFile%" & Exit
::------------------------------------------------------------------
:Search_Replace <InputFile> <OutPutFile>
(
    echo WScript.StdOut.WriteLine Search_Replace(Data^)
    echo Function Search_Replace(Data^)
    echo Dim strPattern, strReplace, strResult,oRegExp
    echo Data = "%~1" 
    echo Data = WScript.StdIn.ReadAll
    echo strPattern = "\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}"
    echo strReplace = "'$&'"
    echo Set oRegExp = New RegExp
    echo oRegExp.Global = True 
    echo oRegExp.IgnoreCase = True 
    echo oRegExp.Pattern = strPattern
    echo strResult = oRegExp.Replace(Data,strReplace^)
    echo Search_Replace = strResult
    echo End Function
)>"%tmp%\%~n0.vbs"
cscript //nologo "%tmp%\%~n0.vbs" < "%~1" > "%~2"
If Exist "%tmp%\%~n0.vbs" Del "%tmp%\%~n0.vbs"
Exit /B
::------------------------------------------------------------------
:Help
Color 0C & Mode 85,3
echo(
echo       Usage : Drag and Drop a txt file over this script:"%~nx0"  
Timeout /T 5 /nobreak>nul & Exit
::------------------------------------------------------------------
1 голос
/ 11 марта 2020

Вы не можете искать и заменять утилитой findstr, она предназначена только для поиска некоторых определенных c шаблонов, а арсенал регулярных выражений весьма ограничен.

Вместо этого рассмотрим короткий скрипт Powershell, который использует. NET regex:

(gc your_file.txt) -replace '\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}', "'`$&'" | sc your_file_updated.txt

См. . NET regex demo .

NOTE :

  • (gc your_file.txt) (= (Get-Content your_file.txt)) читает your_file.txt строка за строкой
  • -replace выполняет замену на основе регулярных выражений для найденного содержимого
  • \d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2} соответствует {4 digits}/{2 digits}/{2 digits} {2 digits}:{2 digits}:{2 digits} шаблонам
  • , а затем '$&' шаблон замены заменяет каждое совпадение на себя ($&) внутри одинарных кавычек
  • sc your_file_updated.txt - (= Set-Content your_file_updated.txt) сохраняет результат в your_file_updated.txt файле.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...