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

时间:2015-12-23 04:16:10

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

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中的整行。

这是我用来测试它的数据。我正在用2.txt中的每一行替换1.txt中的“URL”:

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]

6 个答案:

答案 0 :(得分:1)

{
    // dir is white your temp build files put
    dir: 'build-temp-dir',

    // one module for one minified javascript file
    modules: [{
        // module names are relative to baseUrl
        name: 'mylib/module-entry1',
        // include something else
        include: ['mylib/module2']
    },

    // other one minified javascript file
    {
        name: 'mylib/module-entry2',
        // if you don't want repetitive code put in the two out files
        // just exclude it
        exclude: ['mylib/module-entry1']
    }]

答案 1 :(得分:0)

为了帮助您入门,请考虑以下事项:

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

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

a
1
2
b
1
2
c

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

答案 2 :(得分:0)

@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.txt&的文件q34428552_2.txt包含我的测试数据。

制作u:\ newfile.txt

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

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

答案 3 :(得分:0)

这可能适合你(GNU sed):

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

这将使用file2中的一行顺序替换file1中的每个pattern

答案 4 :(得分:0)

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

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

文件顺序很重要

答案 5 :(得分:0)

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

以下代码将解决您的第二个示例(替换网址)

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"指定要修改的输入文件

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

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

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

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