Заменить определенный текст в строках с каждой строкой из другого файла

346
Gideon

У меня есть текстовый файл с текстом этого заказа;

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 

Заменить определенный текст в строках, а в каждой строке другой файл.

0
Это просто с `bash` и` sed`: вы можете использовать их? AFH 5 лет назад 1
Пожалуйста нет. Немного нового в программировании. Есть идеи, как их использовать? Gideon 5 лет назад 0
Пиз, не пересекай пост https://stackoverflow.com/q/52209990/372239 Toto 5 лет назад 0
Это сценарий, а не программирование. Какие инструменты вы ожидали использовать? NP ++ и AHK не подходят: динамическое редактирование зависит от внешнего файла, и такого рода редактирование возможно только с помощью сценариев или пользовательской программы, такой как довольно простая программа на C (или эквивалент на другом языке). Если вы работаете в Windows (как предполагает NP ++), это может быть возможно в командном файле `cmd`, но это будет довольно сложный файл; в PowerShell это может быть проще, но в PS я выполнял очень тривиальные задачи, поэтому не могу советовать. AFH 5 лет назад 0
В любом случае спасибо AFH. Тем не менее, любой совет или помощь в написании сценариев очень ценится. Должен сказать, я немного новичок. Gideon 5 лет назад 0

2 ответа на вопрос

1
wlod

Предоставление специального решения для данного вопроса на самом деле не принесет особой пользы сообществу суперпользователей, но если перейти к более общему уровню, мы увидим, что это концепция условной замены строк ceratain на основе заданного правила и массива замены.

Я собрал пару строк в 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\))

enter image description here



enter image description here

0
lintalist

Я не понимаю, почему 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  

Похожие вопросы