Ersetzen Sie bestimmten Text in Zeilen mit jeder Zeile aus einer anderen Datei

455
Gideon

Ich habe eine Textdatei mit dem Text dieser Reihenfolge.

str/4 <</Contents(100 cups)/(Date) Colour red <</Contents(080 bowls)/(Date) Status used Pack team <</Contents(200 John)/(Date) School house 

Und noch eine Textdatei mit einer Liste von Wörtern in der Reihenfolge;

Tree house Colon format Same variable 

Nun ist die Frage, wie ich den Text zwischen "Inhalt (" und ") /" in jeder Zeile, dh. 100 Tassen, 080 Schüsseln, 200 John und ersetzen Sie es durch den Text in der entsprechenden Zeile aus meiner zweiten Datei? Die erste zu ersetzende Instanz sollte durch den Text in der ersten Zeile ersetzt werden, die zweite ersetzt die zweite und die dritte die dritte. Nicht sicher, ob ein Autohotkey-Skript oder Notepad ++ hilfreich sein könnte. Das Endergebnis sollte wie folgt aussehen:

str/4 <</Contents(Tree house)/(Date) Colour red <</Contents(Colon format)/(Date) Status used Pack team <</Contents(Same variable)/(Date) School house 

Ersetzen Sie bestimmten Text in Zeilen mit jeder anderen Zeile.

0
Mit `bash` und` sed` ist das unkompliziert: Können Sie diese verwenden? AFH vor 5 Jahren 1
Nein, bitte. Ein bisschen neu in der Programmierung. Irgendeine Idee, wie man diese benutzt? Gideon vor 5 Jahren 0
Bitte geben Sie nicht https://stackoverflow.com/q/52209990/372239 ein Toto vor 5 Jahren 0
Es ist Skripting und nicht Programmieren. Welche Tools erwarteten Sie? NP ++ und AHK sind nicht geeignet: Die dynamischen Änderungen hängen von einer externen Datei ab. Diese Art der Bearbeitung ist nur mit Scripting oder einem benutzerdefinierten Programm möglich, z. Wenn Sie unter Windows arbeiten (wie von NP ++ vorgeschlagen), ist dies möglicherweise in einer `cmd'-Batchdatei möglich, aber es wäre eine ziemlich komplexe. In PowerShell ist es möglicherweise einfacher, aber ich habe in PS nur sehr triviale Aufgaben erledigt, daher kann ich nicht beraten. AFH vor 5 Jahren 0
Trotzdem danke AFH. Trotzdem wird jeder Ratschlag oder jede Hilfe bei der Skriptwunde sehr geschätzt. Bin ein bisschen mehr von einem Anfänger muss ich sagen. Gideon vor 5 Jahren 0

2 Antworten auf die Frage

1
wlod

Die Bereitstellung einer dedizierten Lösung für die gegebene Frage würde der Superuser-Community nicht wirklich einen Mehrwert bringen, aber wenn man auf die allgemeinere Ebene geht, kann man erkennen, dass dies ein Konzept der bedingten Ersetzung bestimmter Zeichenfolgen ist, die auf einer gegebenen Regel und einem Ersetzungsarray basieren.

Ich habe ein paar Zeilen in JavaScript zusammengestellt und in eine HTML-Datei eingefügt, damit sie von jedem Desktop aus ausgeführt werden kann. Es ermöglicht das Spiel mit verschiedenen Szenarien.

<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> 


Die Regel ist in Regex definiert und bietet somit mehr Flexibilität.

Nehmen wir als Beispiel das in der Frage definierte Problem.

Wir müssen eine Regel schreiben, die den zu ersetzenden Teilzeichenfolgen entspricht. Nun ist es Zeit, die Eingaben zu füllen und das Skript auszuführen.

(?<=<<\/Contents\()[^^]*?(?=\)\/\(Date\))





0
lintalist

Ich kann nicht verstehen, warum AHK nicht geeignet wäre, abgesehen von den hier gezeigten Demo-Variablen wären es nur 4 Zeilen Code.

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