我知道很多时候都会问过类似的问题,但我无法锻炼符合我需要的东西......
所以我有一个包含密钥的文件,该行开始如下:
SECRET_KEY =
密钥是非固定长度。
我想找到这一行,将其保存在某个地方,用另一个文件替换包含密钥的所有文件(非常相似,但使用我不想要的不同密钥),并重新引入原始文件新文件中的密钥!
所以目前我有这段代码:
echo Saving the actual SECRET_KEY...
findstr "SECRET_KEY" somefile.py > SECRET_KEY.txt
echo Copying source code files...
xcopy %~dp0\somepath %~dp0\someotherpath /EY
这部分工作正常,因为我已将原始密钥存储在文本文件中,并将文件替换为另一个(与其他文件,目录结构等一起...)
那么现在如何再次找到以SECRET_KEY开头的行并用SECRET_KEY.txt的内容替换所有行?
编辑: 我认为我取得了一些进展:
echo Saving the SECRET_KEY...
findstr "SECRET_KEY" inputfile.py > SECRET_KEY.txt
echo Copying source code files...
xcopy %~dp0\somepath %~dp0\someotherpath /EY
echo Restoring the SECRET_KEY...
setlocal EnableDelayedExpansion
for /F "delims=" %%a in ('findstr /I "SECRET_KEY" SECRET_KEY.txt') do set "secret_key=%%a"
echo !secret_key!
@echo off
set file=inputfile.py
set newline=!secret_key!
set insertline=23
set output=outputfile.py
(for /f "tokens=1* delims=[]" %%a in ('find /n /v "##" ^< "%file%"') do (
if "%%~a"=="%insertline%" (
echo !newline!
) ELSE (
echo.%%b
)
)) > %output%
然后我可以删除SECRET_KEY.TXT,inputfile.py,并将outputfile.py重命名为inputfile.py 很可能不是最有效的方式,但它有效......
除了一件事!我在这个输入文件中有很多特殊字符,这就是我使用的原因!secret_key!例如......
但我也有很多:
[some stuff]
并在outputfile中显示为:
[some stuff
所以我猜我很接近,但我找不到一个分隔符,可以让每个角色都被输出!
答案 0 :(得分:1)
以下脚本首先从文件SECRET_KEY
读取包含otherfile.py
的行;然后它获取放置inputfile.py
的输入文件SECRET_KEY
的行数;之后它逐行读取文件inputfile.py
,检查每个行号是否与之前找到的行号匹配;如果找到匹配项,则返回先前从文件otherfile.py
收集的密钥,因此该行被替换;否则,该行返回未经编辑;输出数据写入文件outputfile.py
:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "INFILE=inputfile.py"
set "OUTFILE=outputfile.py"
set "KEYFILE=otherfile.py"
set "KEYWORD=SECRET_KEY"
rem // Retrieve key from a file:
set "KEY="
setlocal EnableDelayedExpansion
for /F delims^=^ eol^= %%K in ('findstr /L /C:"!KEYWORD!" "%KEYFILE%"') do (
endlocal
set "KEY=%%K"
rem // Toggle delayed expansion inside of the loop to not lose `!`:
setlocal EnableDelayedExpansion
rem // `goto` ensures to take *first* key; remove it to take *last* one;
goto :CONT_KEY
)
:CONT_KEY
endlocal
rem // Retrieve line number where key is found:
set "LRPL="
setlocal EnableDelayedExpansion
for /F "delims=:" %%M in ('findstr /N /L /C:"!KEYWORD!" "%INFILE%"') do (
endlocal
set "LRPL=%%M"
rem // Toggle delayed expansion inside of the loop to not lose `!`:
setlocal EnableDelayedExpansion
rem // `goto` ensures to take *first* key; remove it to take *last* one;
goto :CONT_NUM
)
:CONT_NUM
endlocal
rem // Move line by line from one file to another and replace key:
> "%OUTFILE%" (
rem /* Use `findstr` to precede every line with its line number plus `:`,
rem in order no line to appear empty to `for /F`, as this ignores such;
rem the prefix (up to and including the first `:`) is removed later: */
for /F "delims=" %%L in ('findstr /N /R "^" "%INFILE%"') do (
set "LINE=%%L"
rem // Extract the prefixed number of the current line:
for /F "delims=:" %%N in ("%%L") do set "LNUM=%%N"
rem // Toggle delayed expansion inside of the loop to not lose `!`:
setlocal EnableDelayedExpansion
rem /* Check current line number against previously retrieved one
rem and replace line in case of a match: *//
if !LNUM! EQU !LRPL! (echo(!KEY!) else (echo(!LINE:*:=!)
endlocal
)
)
endlocal
exit /B
请注意,KEYFILE
和INFILE
变量(在脚本顶部定义)可以设置为相同的文件路径。但是,OUTFILE
必须与INFILE
不同;否则推荐的文件将被清空。
这仅包括将文件的SECRET_KEY
行存储到变量以及通过先前存储的文件在文件中交换包含SECRET_KEY
的行并将结果写入另一个文件的任务。