2012-07-06 19 views
3

我遇到问题&替换已写入的批处理脚本。我需要能够打开一个文本文件,并从Windows命令行中更改它的一些值。我无法安装sed.exe或FART或PowerShell,所以我需要这样做。 它是如此容易得多,在linux做....查找并替换不符合空格的脚本/每行多个值

到目前为止,我已经写了这以下scrtipt如果我使用的只有每行一个字一个文件,它完美的作品,所以我可以很容易更改以下格式的文件

AAA
BBB
CCC

而这里的批处理文件:

@echo off 
setlocal enabledelayedexpansion 

if not exist "%1" (echo this file does not exist...)&goto :eof 

for /f "tokens=* delims=" %%a in (%1) do (

    set write=%%a 
    if "%%a"=="%2" set write=%3 

    echo !write! 
    (echo !write!)>>%~n1.replaced%~x1 
) 

del %1 
rename %~n1.replaced%~x1 %1 

我的问题是我最需要改变的文件包含字符串和数字的多个值的行,像这样:

AAA 1.5
BBB 25
CCC 0.1

谁能告诉我为什么我的脚本将不会改变BBB 25BBB 45?这是否与分隔符是一个空间有关?我很确定它与数字无关,就好像我有一个由空格隔开的单词文件,我的脚本也不会工作。

我一直在搜索论坛,并没有发现这个问题,但我会继续搜索。无论如何,您的帮助将不胜感激。

UPDATE
问题解决了!我在DosTips.com上发现了BatchSubstitute.batthis revision,只是在临时文件中添加额外的回应已解决了我的问题。我仍然不确定为什么我发布的代码不起作用,因此如果有人能够解释它会很好。所有这些我都很新!

更新2
这里有我需要从改变一个典型的输入文件:

K1 1E3
K2 2E5
ñ1.5
×10

并经过我运行脚本(replace.bat prefs.txt“k1 1e3”“k1 5e4”)应该是:

K1 5E4
K2 2E5
N1。5
×10

它应该能够改变任何行的文件中。在上次更新的论坛版本似乎能够工作,我只是不知道为什么我发布的第一个版本不起作用。

+0

+1陈述良好的问题和“它是如此容易...”。祝你好运。 – shellter 2012-07-06 14:37:08

+0

哈哈,谢谢。我其实刚刚尝试了[另一篇文章]中提到的dostips.com中的BatchSubstitute.bat(http://stackoverflow.com/questions/60034/how-can-you-find-and-replace-text-in-一个文件 - 使用 - 的 - 窗口的命令行-ENVIR)。在我的Windows 7机器上,它会显示替换的文本,但不覆盖文件,但在XP机器上,我需要这个工作,它根本不工作。需要以某种方式将两个文件拼接在一起。 – jpmorr 2012-07-06 15:01:26

+0

你可以编辑你的文章,包括显示输入和输出的示例运行?或者你只需​​要'...设置写入“%3”'(注意dbl-quotes)。祝你好运。 – shellter 2012-07-06 15:52:34

回答

1

回答你的update2问题。

它应该能够更改文件中的任何行。在上次更新的论坛版本似乎能够工作,我只是不知道为什么我发布的第一个版本不起作用。

这是因为该行
if "%%a"=="%2" set write=%3
将不匹配您的任何线路。
作为%2将扩大到"k1 1e3"所以该线路将扩大到

if "%%a"==""k1 1e3"" set write="k1 5e4"

一个简单的波浪应该做的​​伎俩
if "%%a"=="%~2" set write=%~3

+0

用于'%〜'删除引号。不错的把戏 – SeanC 2012-07-06 16:37:51

+0

是的!谢谢,那现在完美。 – jpmorr 2012-07-06 16:43:53

+0

其实只是遇到了另一个问题 - 文件名的绝对路径。如果我在'rename%〜n1.replaced%〜x1%1'时给出一个_“C:\ Data \ prefs.txt”的文件名,它会在删除原始文件后给出语法错误警告。这是我需要把另一个代字号吗? – jpmorr 2012-07-06 16:57:19

0

是的,问题在于用空格(或引号,如果试图将文本保留在一起)

使用命令行test test.txt BBB 25 BBB 45,则%2为BBB,它不会匹配BBB 25作为25丢失

随着test test.txt "BBB 25" "BBB 45"命令行,然后2%是"BBB 25",它不会匹配BBB 25作为引号丢失。