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

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

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

2 ответа2

1

Предоставление специального решения для данного вопроса на самом деле не принесет особой пользы сообществу суперпользователей, но если перейти к более общему уровню, мы увидим, что это концепция условной замены строк 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\))



Теперь пришло время заполнить поля ввода и запустить скрипт.

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .