如何批量删除文件中的行(或给定行中的文本)?

时间:2013-06-15 18:25:18

标签: batch-file

我的目标是创建批处理脚本,从css文件等文件中删除行本身(如果可能)或给定行中的文本。

css文件

line
199
200      /* K2START */
201      .foo { width: 1 }
202      .bar { width: 2 }
203      /* K2END */
204

我想删除行200和行203(包括评论部分)之间的文字。可以更改行号,因为其他人可能会在文件中添加更多文本。因此,我的选择是找到文本K2STARTK2END,然后在这些行之间删除文字。

批处理脚本

这会返回"200: /* K2START */",这很棒。但我无法弄清楚如何获得行号值“200”并使用它。

findstr /N "K2START" "%K2DIR%\K2 smartforms Designer\Styles\Themes\Sun.css" 

我还尝试遍历css文件的每一行来练习循环,但不管怎么说,不是进入css文件中的每一行文本,整个路径字符串(即"%K2DIR%\K2 smartforms Designer\Styles\Themes\Sun.css")都被视为标记。 / p>

FOR /F "tokens=*" %%G IN ("%K2DIR%\K2 smartforms Designer\Styles\Themes\Sun.css") DO (
@echo %%G
)

3 个答案:

答案 0 :(得分:3)

@echo off
setlocal

rem Get start and end line numbers of the unwanted section
set start=
for /F "delims=:" %%a in ('findstr /N "K2START K2END" "smartforms Designer\Styles\Themes\Sun.css"') do (
   if not defined start (
      set start=%%a
   ) else (
      set end=%%a
   )
)

rem Copy all lines, excepting the ones in start-end section
(for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "smartforms Designer\Styles\Themes\Sun.css"') do (
   if %%a lss %start% echo(%%b
   if %%a gtr %end% echo(%%b
)) > newFile.css

答案 1 :(得分:1)

如果您可以使用gnu awk在Microsoft环境中运行,

awk -f hunter.awk file.txt

hunter.awk:

BEGIN   {printing=1;}
/\/* K2START \*\//      { printing=0; next; }
/\/* K2END \*\//        { printing=1; next; }
                        { if ( printing ) print; }

我可以在GnuWin32建议http://gnuwin32.sourceforge.net/项目。

答案 2 :(得分:1)

这适用于GnuSed - 一个非常宝贵的工具。

sed "/\/\* K2START \*\//,/\/\* K2END \*\//d" file.css >newfile.css

语法是这样的,其中d是从开始文本删除到结束文本

sed“/ start /,/ end / d”file.txt

由于\和*

的转义,它看起来很乱