【问题标题】:win cmd: batch string replacement deletes "!"win cmd:批量字符串替换删除“!”
【发布时间】:2017-12-05 11:42:24
【问题描述】:

我已经缝合了一个脚本,在没有任何更深入的 cmd 知识的情况下,该脚本在目录中的指定文件中搜索某些字符串并将其替换为另一个。 (至少应该)

喜欢

  set "search=readed"
  set "replace=read"
  set "myfiles=.\*.tex"

for %%f in (%myfiles%) do (
  set /p val=<%%f
  echo "fullname: %%f"


  for /f "delims=" %%i in ('type %%f ^& break ^> %%f ') do (
        set "line=%%i"
        setlocal enabledelayedexpansion
        >>%%f echo(!line:%search%=%replace%!)
        endlocal


  )
)
pause

几乎可以工作。它有两个问题。 第一 - 不太重要:删除空白行。 2nd - 删除感叹号。 之前:

% !TEX root = TechRep.tex

之后:

% TEX root = TechRep.tex

我可以寻求帮助吗?谢谢!

【问题讨论】:

  • 删除echo 命令末尾的右括号。尽管看起来,它确实 not 匹配同一行的左括号!相反,它匹配do 关键字之后的左括号。
  • 这似乎工作正常。谢谢!
  • 如果您正在使用纯批处理编辑文件以获得刺激(为了挑战),那么请把自己打倒。但是,如果您只是想完成一项任务,那么我强烈建议您做其他事情。纯批处理对于文本文件编辑来说很糟糕,因为它速度很慢,而强大的解决方案需要晦涩难懂、不直观的语法和技术。我推荐JREPL.BAT - a hybrid regular expression text processing utility that uses JScript and batchfor %%F in (*.tex) do call jrepl "readed" "read" /f "%%F" /o -
  • 嗨!它并没有给我带来任何特别的快乐。无论机器及其配置,我只需要这些东西工作。使用我几乎知道的。

标签: loops batch-file for-loop cmd str-replace


【解决方案1】:

有两个问题:

  1. 跳过空行。这是由for /f 命令中的限制引起的。你可以使用旧的findstr trick 来解决这个问题。

  2. 删除了感叹号。这是由echo 命令中错误的右括号) 引起的。同一行echo( 中的左括号被忽略,并且与右括号不匹配。相反,右括号与do 循环的开始相匹配。包含endlocal 命令的下一行是在循环之外。这似乎会导致问题,因为循环内部有一个 setlocal,外部有一个 endlocal;通过某种奇怪的机制,这以某种方式导致感叹号被删除。从 echo 行中删除),这个问题就消失了。

【讨论】:

  • 不,您不能将echo( 更改为echo ,因为如果脚本遇到只包含空格的行,它将写入ECHO is off.
  • 第 2 行及以后的感叹号被删除,因为启用了延迟扩展,%%I 将扩展带有感叹号的表达式(延迟扩展发生在 FOR 变量扩展之后)。
  • 我可能会在删除空白后幸存下来。括号结束清除。 ;)
  • @dbenham 好点。我已经从我的回答中删除了不正确的陈述。
猜你喜欢
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2018-11-13
  • 1970-01-01
  • 2015-07-17
相关资源
最近更新 更多