批处理怎么进行复杂的批量替换?

88 2.25E+02 2.3E-02 -9.5E-03 1.0E+00 1.8E+00 1.0E+00

txt文件中有很多行上面格式的数据,

每行的1.00E+00出现位置和数量都是随机的,前两个数字肯定不会出现1.00E+00

现在想用bat实现

1.保留每行的前两个数

2.把每行第二个数往后的除去1.0E+00的所有数,替换为符号“-”,保持原有的空格不动

即变成 88 2.25E+02 ------- -------- 1.0E+00 ------- 1.0E+00
最新回答
星月满屋

2025-03-01 07:34:30

以下是一种实现方式,可以将其保存为.bat批处理文件执行:

bashCopy code@echo off
setlocal enabledelayedexpansionset "findstrPattern=[0-9.]+E[+-][0-9]+"set "replacementPattern=--------"for /f "delims=" %%i in (input.txt) do (  set "line=%%i"
set "firstTwo=!line:~0,15!"
set "rest=!line:~15!"
set "replaced=!rest:%findstrPattern%=%replacementPattern%!"
echo !firstTwo!!replaced!
)

其中input.txt为数据文件名,可以根据实际情况修改。该批处理文件的具体实现方法如下:

  • 首先设置了一个findstrPattern变量和一个replacementPattern变量,分别用于匹配要替换的文本和替换后的符号。

  • 使用for循环遍历输入文件的每一行数据。

  • 在循环中,首先将整行数据存储到line变量中。

  • 接着使用!line:~0,15!获取每行的前两个数,存储到firstTwo变量中。

  • 然后使用!line:~15!获取从第三个数开始到行末的字符串,存储到rest变量中。

  • 使用!rest:%findstrPattern%=%replacementPattern%!替换rest变量中所有匹配findstrPattern变量的字符串为replacementPattern变量中的符号,将替换后的字符串存储到replaced变量中。

  • 最后使用echo输出firstTwo和replaced变量拼接后的字符串。

  • 这个批处理文件中使用了延迟变量扩展,即在for循环中使用!括起变量名。这是因为在循环中修改变量时,如果使用%括起变量名,循环会一次性解析完所有变量后再开始执行,这样会导致变量的值无法正确更新。使用!括起变量名可以在每次循环中动态地解析变量,从而正确地更新变量的值。

人生如梦梦如烟

2025-03-01 11:42:39

复杂的批量替换可以通过使用正则表达式来实现。以下是一个示例:假设你有一个文本文件,其中包含许多日期,格式为“YYYY-MM-DD”,你想将它们全部替换为“MM/DD/YYYY”。1. 打开文本编辑器,如Notepad++或Sublime Text。2. 打开要进行替换的文本文件。3. 在编辑器中打开“查找和替换”功能。在Notepad++中,你可以使用快捷键Ctrl+H;在Sublime Text中,你可以使用快捷键Ctrl+Shift+H。4. 在“查找”字段中输入正则表达式“(\d{4})-(\d{2})-(\d{2})”,它将匹配所有格式为“YYYY-MM-DD”的日期。5. 在“替换”字段中输入“$2/$3/$1”,它将把日期格式转换为“MM/DD/YYYY”。6. 点击“替换全部”按钮,编辑器将自动替换所有匹配的日期。请注意,正则表达式的语法可能会因编辑器而异,因此请查看你使用的编辑器的文档以了解更多信息。
可爱的狗蛋

2025-03-01 01:09:59

以下是一个实现:
@echo off
setlocal EnableDelayedExpansion

set input_file=data.txt
set output_file=output.txt

for /f "tokens=1,2,*" %%a in (%input_file%) do (
set line=%%a %%b
set line=!line: =_!
for /f "tokens=* usebackq" %%x in (`echo %%c ^| find /v "1.0E+00"`) do (
set line=!line! %%x
)
echo !line! >> %output_file%
)

echo Done.
其中:
- 使用了`for /f`循环读取输入文件中的每一行,并分别把前两个数据赋给`%%a`和`%%b`,剩余数据赋给`%%c`。
- 把前两个数据组成一个子字符串`!line!`。
- 遍历`%%c`,把不等于`1.0E+00`的数据拼接到`!line!`中。
- 把`!line!`写入输出文件。
注意,这个实现会忽略空格和制表符开头的行。如果需要处理这些行,可以添加如下内容:

if "!line!" == "" (
set line=%%a %%b
)
追问
层主,这个实现了保留前两行,但没有实现非1.00E+00的数据替换
逗逼太愉快

2025-03-01 11:19:40

不清楚你的实际文件/情况,仅以问题中的样例/说明及猜测为据;以下代码复制粘贴到记事本,另存为xx.bat,编码选ANSI/GB2312,跟要处理的文件放一起双击运行
<# :
cls&echo off&cd /d "%~dp0"&mode con lines=5000
rem 将一个txt文本文件内每一行指定特征的字段中的每个字符替换成指定字符
path %SYSTEMROOT%\System32\WindowsPowerShell\v1.0;%path%
set #=Any questions&set _=WX&set $=Q&set/az=0x53b7e0b4
title %#% +%$%%$%/%_% %z%
set "current=%cd%"
powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0'|Out-String|Invoke-Expression"
echo;%#% +%$%%$%/%_% %z%
pause
exit
#>
$current=($env:current).trimend('\');
$files=@(dir -literal $current|?{('.txt' -eq $_.Extension) -and ($_ -is [System.IO.FileInfo])});
if($files.length -ge 1){
    $enc=New-Object System.Text.UTF8Encoding $False;
    $text=[IO.File]::ReadAllLines($files[0], $enc);
    for($i=0;$i -lt $text.count;$i++){
        $m=[regex]::match($text[$i], '^(\s*?\S+\s+\S+)(\s+\S.*)$');
        if($m.Success){
            $text[$i]=$m.groups[1].value+[regex]::replace($m.groups[2].value, '\S+', {
                param($r);
                if($r.groups[0].value -ne '1.0E+00'){
                    return ($r.groups[0].value -replace '\S','-');
                }else{return $r.groups[0].value;}
            });
        }
        $text[$i];
    }
}
盖世傻白甜

2025-03-01 12:02:33

可以使用批处理中的for循环和字符串操作来实现。
下面是一个可能的实现方式:
@echo off
setlocal enabledelayedexpansionset "target=1.0E+00"set "replacement=-------"for /f "tokens=1-7" %%a in (input.txt) do ( set "line=%%a %%b %%c %%d %%e %%f %%g"
set "output=!line:*%%b=!"
set "output=!output:%target%=%replacement%!"
echo %%a !output!
)

其中,target是需要替换的目标字符串,replacement是替换后的字符串。
在for循环中,使用tokens=1-7将每行的数据分成7个部分,分别对应%%a到%%g。
接下来,将整行数据赋值给变量line。由于需要对%%b之后的部分进行替换,因此需要先将%%b之前的部分从line中删除,然后将删除后的字符串赋值给变量output。
最后,使用!output:%target%=%replacement%!将output中的目标字符串替换为指定的字符串。
这里使用了setlocal enabledelayedexpansion开启了延迟环境变量扩展,这样可以在循环中使用!output!的形式来访问变量。