【问题标题】:Replace specific string in one text file with a incrementing line from another text file用另一个文本文件中的递增行替换一个文本文件中的特定字符串
【发布时间】:2016-03-29 11:13:43
【问题描述】:

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]

【问题讨论】:

  • 请告诉我们您的尝试。 SO 是一个询问编程相关问题的门户。没有人会为您编写所有代码。

标签: batch-file replace sed scripting text-processing


【解决方案1】:

为了让您开始,请考虑以下几点:

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 命令替换变量中的值。

【讨论】:

  • 恐怕我不明白发布不能解决问题的“答案”的目的是什么!您可以仅在评论中发布此“建议”...
  • @Aacini 这是因为 OP 没有尝试(或者 OP 没有在他的问题中发布)。我只是将 OP 指向一个可能的方向。我没有太多时间来编写具有完整逻辑的脚本,我相信我们是来帮忙的。此外,如果正确扩展,该解决方案将起作用。关于将“建议”作为评论发布,恐怕我当时没有足够的声誉来评论他的问题。这不是我能做的。
【解决方案2】:
@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

本质上,将替换文件读入变量名称$1$2 等。

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

【讨论】:

  • 有点作品。 2.txt 中每一行的第一个字符丢失。特别是左括号“[”没有显示出来。
  • 您提供了示例数据。 Batch 对不同情况下的许多字符敏感;该特定构造对初始[] 敏感。您可以将 find /n /v "" 替换为 findstr /n /v /r ".*" 并将 delims 字符列表更改为 : - 然后它将对 : 敏感。如果没有更多信息,就不可能测试所有可能的场景。
  • 出于好奇试图让它工作,但不能。哦,好吧。
【解决方案3】:
@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
      )

   )

)

【讨论】:

  • 不工作。替换字符串,但只保留 1.txt 中的第一个单词(空格前)。
  • @RossKempDeep - 这是因为您最初的问题暗示每一行输入只有一个单词。您还暗示您每次都在更换整条生产线。 Aacini 的代码可以很容易地修复以保留一行中的所有单词。但是在整行文本中间替换一个单词需要大量修改
【解决方案4】:

这可能对你有用(GNU sed):

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

这会将 file1 中的每个 pattern 依次替换为 file2 中的一行。

【讨论】:

  • 这将替换 1.txt 中的 整个 行。我们只想替换一个字符串。
【解决方案5】:

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

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

文件顺序很重要

【讨论】:

  • 就像 sed 命令(通过@potong)一样,它替换了 1.txt 中的 整个
【解决方案6】:

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

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

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

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

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

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

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

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

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

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

【讨论】:

  • 我只需要命令,但你在这里超出了职责范围。哈哈。节日快乐。
猜你喜欢
  • 2018-03-29
  • 2019-03-21
  • 2023-04-08
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 2012-11-06
  • 1970-01-01
相关资源
最近更新 更多