批处理文件替换包含特定字符串值的行

批处理文件替换包含特定字符串值的行

例如,我有一个名为 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记录标记并替换整行,因为对现有数据进行修改后,长度需要相同。

我发现的大多数示例都与用另一个字符串替换一个字符串有关,如此处的示例所示

https://stackoverflow.com/questions/23075953/batch-script-to-find-and-replace-a-string-in-text-file-without-creating-an-extra/23076141?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

https://stackoverflow.com/questions/16614101/batch-script-find-string-in-text-file-by-line-then-replace-whole-line-with-anot?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

但无法修改批处理文件以完成我需要的操作。

任何建议都值得感激。

答案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
...

相关内容