我有一个包含此订单文本的文本文件;
str/4
<</Contents(100 cups)/(Date)
Colour red
<</Contents(080 bowls)/(Date)
Status used
Pack team
<</Contents(200 John)/(Date)
School house
另一个文本文件包含按顺序排列的单词列表;
Tree house
Colon format
Same variable
现在的问题是,如何在每行中搜索或匹配“Contents(”和“)/”之间的文本,即。100杯,080碗,200 约翰并将其替换为第二个文件中相应行的文本?第一个要替换的实例应替换为第一行中的文本,第二个替换第二行,第三个替换第三个。不确定 autohotkey 脚本或 notepad++ 是否有帮助。最终结果应如下所示;
str/4
<</Contents(Tree house)/(Date)
Colour red
<</Contents(Colon format)/(Date)
Status used
Pack team
<</Contents(Same variable)/(Date)
School house
用另一个文件的每一行替换行中的特定文本。
答案1
为给定的问题提供专门的解决方案实际上不会给超级用户社区带来太多价值,但从更一般的层面来看,我们可以看到这是一个基于给定规则和替换数组对某些字符串进行条件替换的概念。
我用 JavaScript 编写了几行代码并将其放在 html 文件中,以便可以从任何桌面运行。它允许在不同场景下进行游戏。
<head>
<title>Conditional replacement</title>
</head>
<body>
Input:
<br>
<textarea rows="15" cols="50" id="input1">
</textarea>
<textarea rows="15" cols="50" id="input2">
</textarea>
<br>
<br> Regex rule:
<input type="text" id="pattern" size="42">
<br>
<br>
<button type="button" onclick="myFunction()">Run and generate output</button>
<br>
<br> Output and errors:
<br>
<textarea rows="15" cols="50" id="output"></textarea>
<textarea rows="15" cols="50" id="errors"></textarea>
<script>
function myFunction() {
var i1 = document.getElementById("input1").value;
var lines1 = i1.split("\n");
var i2 = document.getElementById("input2").value;
var lines2 = i2.split("\n");
var rule = document.getElementById("pattern").value;
var output = "";
var errors = "";
var j = 0;
try {
for (var i = 0; i < lines1.length; i++) {
if (lines1[i].search(rule) !== -1) {
var re = new RegExp(rule, "g");
if (lines2[j] === undefined) {
errors += "No replacement for line match: " + lines1[i];
output += lines1[i] + "\n"; // no change
} else {
output += lines1[i].replace(re, lines2[j]) + "\n";
j++;
}
} else {
output += lines1[i] + "\n";
}
}
} catch (err) {
errors += err.message + "\n";
}
document.getElementById("output").value = output;
document.getElementById("errors").value = errors;
}
</script>
</body>
</html>
该规则是在正则表达式中定义的,因此它提供了更大的灵活性。
我们仅以问题中定义的问题为例。
我们需要编写一条规则来匹配需要替换的子字符串。
(?<=<<\/Contents\()[^^]*?(?=\)\/\(Date\))
现在是时候填写输入并运行脚本了。
答案2
我不明白为什么 AHK 不适合,除了下面的演示变量之外它只有 4 行代码。
source= ; replace with FileRead
(
str/4
<</Contents(100 cups)/(Date)
Colour red
<</Contents(080 bowls)/(Date)
Status used
Pack team
<</Contents(200 John)/(Date)
School house
)
replace= ; replace with FileRead
(
Tree house
Colon format
Same variable
)
Loop, parse, replace, `n, `r
source:=RegExReplace(source, "U)Contents\((.*)\)", A_LoopField,,1)
MsgBox % source