例如,我有一个名为 RawData.txt 的接口文件,其中包含不同区域的数据,范围从几千行到接近 100,000 行数据。
例如,有多种行
01 0000000000000000000000000000000198699 XYZ
其中包含除 0 之外的 int 值,有时需要替换为
01 0000000000000000000000000000000000000 XYZ
但由于 01 和 XYZ 标记之间的 int 值的变化,在文本编辑器中直接查找和替换将不起作用。
我需要操作的部分结构如下:
01 00000000000000000000000000000198699 XYZ
02 157
01 00000000000000000000000000000007749 XYZ
02 158
01 00000000000000000000000000000183279 XYZ
02 163
01 00000000000000000000000000000007749 XYZ
02 165
01 00000000000000000000000000000000000 XYZ
02 175
理想情况下,我希望整理一个批处理文件,该文件搜索 .txt 文件中以 01 记录标记开头的任何行,并用以下内容替换该行:
01 0000000000000000000000000000000000000 XYZ
我认为最直接的方法是找到以01记录标记并替换整行,因为对现有数据进行修改后,长度需要相同。
我发现的大多数示例都与用另一个字符串替换一个字符串有关,如此处的示例所示
和
但无法修改批处理文件以完成我需要的操作。
任何建议都值得感激。
答案1
这可能是你想要的
批处理文件出奇地巧妙地处理了这个问题!
a.a
您的数据文件在哪里
blahblah.bat 是一个单行批处理文件
C:\Users\harvey>type blahblah.bat
@for /f "tokens=1,2 delims= " %%f in (a.a) do @IF "%%f"=="01" (echo 01 00000000000000000000000000000000000 XYZ) ELSE IF NOT "%%f"=="01" ECHO %%f %%g
C:\Users\harvey>
执行批处理文件
C:\Users\harvey>blahblah
01 00000000000000000000000000000000000 XYZ
02 157
01 00000000000000000000000000000000000 XYZ
02 158
01 00000000000000000000000000000000000 XYZ
02 163
01 00000000000000000000000000000000000 XYZ
02 165
01 00000000000000000000000000000000000 XYZ
02 175
C:\Users\harvey>
这似乎确实删除了空行,也许有使用批处理的方法可以解决这个问题,但是除了批处理之外,另一种方法是使用 sed。
C:\Users\harvey>sed -r "s/^01.*/01 00000000000000000000000000000000000 XYZ/" a.a
01 00000000000000000000000000000000000 XYZ
02 157
01 00000000000000000000000000000000000 XYZ
02 158
01 00000000000000000000000000000000000 XYZ
02 163
01 00000000000000000000000000000000000 XYZ
02 165
01 00000000000000000000000000000000000 XYZ
02 175
当然,您可以添加>b.b
将输出重定向到新文件,因此您可以执行sed -r "......." a.a > b.b
iesed -r "s/^01.*/01 00000000000000000000000000000000000 XYZ/" a.a > b.b
答案2
解析文件并保留空行的一种方法是通过 findstr 对行进行编号
(这样它们对于 for /f 循环来说就不为空)
并在之后丢弃该编号。
:: Q:\Test\2018\05\11\SU_1321271.cmd
@Echo off&SetLocal
Set "ZEROES=00000000000000000000000000000000000"
( for /f "tokens=1,2* delims=: " %%A in (
'findstr /N "^" RawData.txt'
) do If "%%B"=="01" (
echo=%%B %ZEROES% XYZ
) else (
echo=%%B %%C
)
) >NewData.txt
> type NewData.txt
01 00000000000000000000000000000000000 XYZ
02 157
01 00000000000000000000000000000000000 XYZ
02 158
...