批处理文件:用单词替换文本文件中的行的内容

时间:2015-03-04 05:58:00

标签: batch-file

我目前有一个文本文件(file.txt),如下所示:

String [date]
data1

String [another date]
data2

String [another date]
data3

我希望有一个批处理文件,只保留每个块第一行的字符串,知道每次的日期不同。以下是输出的示例:

String
data1

String
data2

String 
data3

由于我有一个超过95,000行的文本文件,我想我必须搜索包含特定字符串的行,然后删除它们上的所有内容,除了研究的字符串。

1 个答案:

答案 0 :(得分:0)

字符串操作是批处理文件一直很糟糕的一件事。最干净的方法是使用了解正则表达式和字符串搜索/替换的工具。例如,使用GNU Sed:

sed -e s/^String.*$/String/g file.txt > output.txt

或使用Windows附带的PowerShell

powershell -noprofile -C "gc 'file.txt' | % { $_ -replace 'String.*','String' } | sc output.txt"

这个特殊问题并不需要正则表达式的全部功能,可以批量完成。脚本逐行遍历文件。对于每一行,如果它以" String"开头,那么写" String"输出;否则写下原来的一行。

copy nul output.txt
for /f "tokens=1* delims=:" %%a in ('findstr /n "^" file.txt') do call :do_line "%%b"
goto :eof

:do_line
set line=%1
if {%line:String =%}=={%line%} (
  echo.%~1 >> output.txt
  goto :eof
)
echo string >> output.txt

脚本的第一行使用来自this thread的技巧来保留空行。它的缺点是,如果原始文件中的任何行以:开头,则冒号将被剥离。