用另一个文本文件中的递增行替换一个文本文件中的特定字符串
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.txt
和 q34428552_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 /??
)可以获得完整的文档
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.txt
和 q34428552_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 /??
)可以获得完整的文档