用另一个文本文件中的递增行替换一个文本文件中的特定字符串

Replace specific string in one text file with a incrementing line from another text file

2 个文件:

在1.txt

a
$test$
b
$test$
c

在2.txt

1
2

我想要的:

a
1
b
2
c

我更喜欢 Windows BAT 脚本,但是像 sed 这样的单个 Unix 可执行文件就可以了。

更新:

@Magoo 的解决方案有效,除了文件 2 中每一行的第一个字符都消失了:(.

@Aacini 的代码无效。不复制文件 1 中的整行,只复制第一个单词。它确实复制了文件 2 中的整行。

这是我用来测试的数据。我将 1.txt 中的 "URL" 替换为 2.txt 中的每一行:

File 1.txt
File Name: 01 - AM FM.flac (FLAC)
File Size: 33.12 MiB (34729455 bytes)
Duration: 00:04:55.173
Audio: FLAC  940 Kbps 44.1 KHz  16 bits 2 channels
asdfsfd URL sdfasdf

File Name: 08 - Chick Habit.flac (FLAC)
File Size: 15.89 MiB (16664220 bytes)
Duration: 00:02:09.093
Audio: FLAC  1 023 Kbps 44.1 KHz  16 bits 2 channels
asfsdf URL asdfsadf

文件2.txt

[sdfd=http://aaaaaaaa/][IMG]http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.jpg[/IMG][/URL]
[sdfdsfd=http://bbbbbbbbbb/][IMG]httbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.jpg[/IMG][/URL]

为了让你开始,考虑这个:

sed -e '/$test$/{r file2' -e 'd}' file1

根据您的要求,逻辑不完整,因为目前它会将 1.txt 中的所有内容交替粘贴到文件 2.txt 中的 $test$。所以你将拥有:

a
1
2
b
1
2
c

提示: 此外,您可以设置一个逻辑来只读取 2.txt 中的交替行。可能是一个脚本,通过 2.txt 循环进入一个临时变量,并在每个循环中使用上面的 sed 命令替换变量中的值。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "targetstring=$test$"
:: read second file and store contents in $linenumber
FOR /f "tokens=1*delims=[]" %%a IN ('find /n /v "" q34428552_2.txt') DO SET "$%%a=%%b"
SET /a $=0
:: now read-file-and-substitute
(
FOR /f "delims=" %%a IN (q34428552.txt) DO (
 IF "%%a"=="%targetstring%" (
  SET /a $+=1
  CALL ECHO(%%$!$!%%
  ) ELSE ECHO %%a
)
)>u:\newfile.txt


GOTO :EOF

我使用了名为 q34428552.txtq34428552_2.txt 的文件,其中包含您的数据用于我的测试。

产生 u:\newfile.txt

本质上,将替换文件读入变量名称</code>、<code>

然后读取主文件;如果该行与目标不匹配,则返回它,但如果匹配,则使用 $ 作为计数器替换变量 $count 的内容。

@echo off
setlocal EnableDelayedExpansion

rem Read file2 from redirected input
< file2.txt (

   rem Process file1 via FOR /F loop
   for /F %%a in (file1.txt) do (

      rem If line in file1 is "$test$"
      if "%%a" equ "$test$" (
         rem Change it by next line in file2
         set /P "line2="
         echo !line2!
      ) else (
         echo %%a
      )

   )

)

这可能适合您 (GNU sed):

sed -e '/pattern/R file2' -e '//d' file1

这会将文件 1 中的每个 pattern 依次替换为文件 2 中的一行。

使用 awk(与 shell 脚本或 sed 相比,满足此需求的最佳套件)

awk 'FNR==NR{T[NR]=[=10=];next}/$test$/{print T[++i];next}1' 2.txt 1.txt

文件顺序很重要

使用 JREPL.BAT - a regular expression text processing utility 这非常简单。 JREPL 是纯脚本(混合 JScript/batch),从 XP 开始可以在任何 Windows 机器上本地运行。

下面的代码将解决您的第二个示例(替换 URL)

jrepl "URL" "stdin.AtEndOfStream?[=10=]:stdin.ReadLine()" /j /f "file1.txt" <"file2.txt" /o -
  • "URL" 要搜索的文本。您可以添加正则表达式术语以使搜索非常具体。如所写,即使在单词中间,它也会替换 URL。

  • "stdin.AtEndOfStream?[=12=]:stdin.ReadLine()" 替换表达式。如果我们已经到达 file2 的末尾,则它用自己替换搜索,否则用 file2 中的下一行替换。

  • /j 指定第二个参数将被视为 JScript 表达式

  • /f "file1.txt"指定要修改的输入文件

  • <"file2.txt" 指定从中找到替换字符串的文件

  • /o -指定输出是覆盖原文件

请记住,JREPL 本身就是一个批处理脚本,因此如果您在另一个批处理脚本中使用该命令,则必须使用 call jrepl

使用 jrepl /?(如果需要分页帮助,则使用 jrepl /??)可以获得完整的文档