【问题标题】:String processing using Batch Script使用批处理脚本处理字符串
【发布时间】:2010-11-17 22:08:13
【问题描述】:

我目前正在创建一个批处理脚本,该脚本必须遍历文件中的行,检查某些字符串,以及该字符串是否有匹配前缀,带有“#”(注释掉)。

我对批处理脚本完全陌生,到目前为止我得到的只是:

for /f %%j in (CMakeLists.txt) do (
    if "%%j"=="Extensions_AntTweakBar" (
        echo lol1
    )
    if "%%j"=="Extensions_Inspection" (
        echo lol2
    )
    if "%%j"=="Extensions_InspectionBar" (
        echo lol3
    )
)

所以我目前的问题是,我不知道如何在批处理脚本中操作字符串。如果有人可以帮助我,将不胜感激:)

【问题讨论】:

  • 可以在bat中完成...但是为什么选择它呢?
  • 这可以在普通的旧 DOS 中轻松完成。如果不是更多,我已经做了 1000 次。今晚我会回到这个问题 - 圣诞节快到了!
  • 您能否提供一个示例文件,以便我们查看是否有任何需要保留的文本格式,例如空行、缩进等...或者您可以肯定地说这不是我们需要关注的问题?

标签: string file-io batch-file


【解决方案1】:

一般情况下,您可以只使用要附加的文本,后跟变量。

C:\>set MY_VAR=Hello world!
C:\>echo #%MY_VAR%
#Hello world!

C:\>set MY_VAR=#%MY_VAR%
C:\>echo %MY_VAR%
#Hello world!

如果你只是在做回声,那很好。 echo #%%j 会做你需要的。

但是如果你想将行设置为一个变量,你必须enable delayed expansion。将setlocal ENABLEDELAYEDEXPANSION 添加到文件顶部,然后用! 而不是% 包围变量。例如(请注意,我添加了delims= 以将整行放入%%j,而不是行中的第一个单词):

@echo off

setlocal ENABLEDELAYEDEXPANSION

set LINE=
for /f "delims=" %%j in (CMakeLists.txt) do (
    set LINE=%%j
    if "%%j"=="Extensions AntTweakBar" (
        set LINE=#%%j
    )
    if "%%j"=="Extensions Inspection" (
        set LINE=#%%j
    )
    if "%%j"=="Extensions InspectionBar" (
        set LINE=#%%j
    )

    echo !LINE!
)

给定这个输入文件:

Extensions AntTweakBar
some text
Extensions Inspection
Extensions What?
some more text
Extensions InspectionBar
Extensions InspectionBar this line doesn't match because delims= takes all text
even more text

上面的脚本产生这个输出:

C:\>comment.bat
#Extensions AntTweakBar
some text
#Extensions Inspection
Extensions What?
some more text
#Extensions InspectionBar
Extensions InspectionBar this line doesn't match because delims= takes all text
even more text

当然,删除@echo off 会帮助您调试问题。

但话虽如此,您已经达到了批处理字符串处理所能完成的极限。如果您仍想使用批处理命令,您可能需要开始将行写入临时文件并使用带有正则表达式的findstr

【讨论】:

  • 这几乎是我现在正在做的事情,我自己修好了:) - 但是 +1 :)
【解决方案2】:

如果没有更好地了解循环中的内容或 CMakeLists.txt 文件的外观,请尝试以下方法:

FINDSTR "SOMETHING" %%J && ECHO #%%J || ECHO %%J

&& 使第二个命令(ECHO)以第一个命令退出且没有错误状态为条件,而 ||就像一个逻辑或,当第一个没有时它运行。

真的,要修改文本文件的内部结构,使用sedawk 可能会好得多——win32 二进制文件可以在UnxUtils 项目中找到。

【讨论】:

  • 我知道这一点,但问题是,我不能像 sed 或 awk 那样依赖,否则这将是正确的做法。 - 我用更多的代码更新了主目录,这似乎有效,它现在找到了 3 条重要的行,但是我如何在它们前面加上“#”?
  • @Skeen - 你可以依赖 PowerShell 或者更强大的文本处理能力吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
相关资源
最近更新 更多