Substitua determinado texto em linhas por cada linha de outro arquivo

0

Eu tenho um arquivo de texto com o texto deste pedido;

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

E outro arquivo de texto com uma lista de palavras na ordem;

Tree house
Colon format
Same variable

Agora, a pergunta é: como faço para pesquisar ou corresponder o texto entre "Contents (" e ") /" em cada linha, ou seja, 100 xícaras , 080 taças , 200 John e substituí-lo com o texto na linha correspondente do meu segundo arquivo? A primeira instância a ser substituída deve ser substituída pelo texto na primeira linha, a segunda substituindo a segunda e a terceira pela terceira. Não tenho certeza se um script autohotkey ou o notepad ++ poderia ajudar. O resultado final deve parecer:

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

Substitua determinado texto em linhas por cada linha com outro arquivo.

    
por Gideon 06.09.2018 / 19:03

2 respostas

1

Fornecer uma solução dedicada para a questão dada não agregaria muito valor à comunidade de superusuários, mas indo para o nível mais geral, podemos ver que este é um conceito de substituição condicional de cadeias baseadas em uma determinada regra e matriz de substituição. .

Eu coloquei algumas linhas em JavaScript e coloquei em arquivo html para que ele possa ser executado em qualquer desktop. Permite jogar com diferentes cenários.

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


A regra é definida em regex, por isso oferece mais flexibilidade.

Vamos apenas usar como exemplo o problema definido na pergunta.

Precisamos escrever uma regra que corresponda aos substrings que precisam ser substituídos.

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



Agora é hora de preencher as entradas e executar o script.

    
por 12.09.2018 / 11:45
0

Eu não vejo por AHK não seria adequado, além das variáveis de demonstração aqui abaixo seria apenas 4 linhas de código.

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 
    
por 11.10.2018 / 22:54