【问题标题】:Find string and replace each occurance with different string查找字符串并用不同的字符串替换每次出现
【发布时间】:2011-07-08 02:18:47
【问题描述】:

我正在为以下问题寻找一个简单的批处理解决方案:

在许多文件中,我想用另一个字符串替换一个字符串。可以用记事本++做到这一点。但是,每个新字符串必须是唯一的,从新字符串列表中读取。

所以,如果'abc'出现在某些文件中,并且我有一个包含新字符串的列表,请以这种方式替换它:

abc --> 亚历克斯
abc --> 本
abc --> 克里斯
abc --> 戴夫
等等。

我可以有一个 txt 文件,其中包含要读取的新字符串。

希望有人为我提供解决方案!

非常感谢, 伦纳特

【问题讨论】:

  • 针对此类问题的简单批处理解决方案?几乎不可能。然而,最终它可能只取决于你认为什么是简单的。
  • @Andriy:仅当您对“批处理”的定义是“.bat 文件”时...

标签: list batch-file replace


【解决方案1】:

Perl 脚本可以工作吗?

my @words = qw(alex ben chris dave ...);

while (<>) {
    s/abc/shift @words/ge;
    print;
}

如果你想让单词列表循环:

my @words = qw(...);
my $i = 0;

while (<>) {
    # I know I should have written this in a more readable way...
    s{abc}{$words[$i++] // $words[$i=0]}ge;
    print;
}

【讨论】:

  • s/x/y/z中,x是一个正则表达式,y是替换文本,z 是标志。如果指定了“e”标志,则替换文本被视为可执行的 Perl 代码。
【解决方案2】:

或作为批处理脚本

@echo off
setlocal Disabledelayedexpansion
set "wordlist=alex ben chris dave"
for /F "tokens=* delims=" %%a in (myFile.txt) do (
    set "line=%%a"
    setlocal Enabledelayedexpansion
    for /F "tokens=1,*" %%b in ("!wordlist!") do (
        set "newline=!line:abc=%%b!"
        (echo(!newline!)
        if !newline! NEQ !line! (
            endlocal
            set "wordlist=%%c"
        ) ELSE ( 
            endlocal 
        )
    )   
)

编辑更改为“!”安全变种

【讨论】:

  • 不幸的是,即使在 set "line=%%a" 中也会发生延迟扩展,导致源文本中看起来像 !variable! 的所有内容都被扩展。 (在外部 for 循环内移动 setlocal 似乎可以解决它。)
  • @grawity:好吧,我只展示了一个简单的解决方案,而不是完美的解决方案,完美的解决方案要复杂得多
【解决方案3】:

尝试找到支持 -i (--inline) 开关的 Windows 的 sed 可执行文件,您的工作将成为幼儿的任务!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多