Ich habe drei Dateien
~/naive-file.txt
~/old-text.txt
~/new-text.txt
Ich möchte jeden Fall finden, in dem der Inhalt von ~/old-text.txt
vorkommt, ~/naive-file.txt
und diese Vorkommen durch den Inhalt von ersetzen ~/new-text.txt
. Ich bin mir sicher, dass dies mit sed
oder machbar ist, awk
aber ich kann anscheinend nicht den richtigen Befehl finden. Ist das möglich?
Angenommen, der Inhalt von ~/naive-file.txt
ist
$ cat ~/naive-file.txt
Sed id ligula quis est convallis tempor.
This is the old text.
It might have multiple lines and some special characters like these \ { & % #)!
etc...
Nunc aliquet, augue nec adipiscing interdum, lacus tellus malesuada massa, quis
varius mi purus non odio.
Angenommen, der Inhalt von ~/old-text.txt
ist
$ cat ~/old-text.txt
This is the old text.
It might have multiple lines and some special characters like these \ { & % #)!
etc...
Angenommen, der Inhalt von ~/new-text.txt
ist
$ cat ~/new-text.txt
This is the new text.
It could also have multiple lines and special characters like these \ { & %
etc...
Das Ausführen meines gewünschten Befehls würde dann erzeugen
Sed id ligula quis est convallis tempor.
This is the new text.
It could also have multiple lines and special characters like these \ { & %
etc...
Nunc aliquet, augue nec adipiscing interdum, lacus tellus malesuada massa, quis
varius mi purus non odio.
text-processing
awk
sed
Brian Fitzpatrick
quelle
quelle
old-text.txt
durch erste Zeichenfolge von ersetzt werdennew-text.txt
und so weiter?Antworten:
Perl zur Rettung!
Lesen Sie die Ersatzpaare in einen Hash. Lesen Sie dann die Eingabe Zeile für Zeile und versuchen Sie, die Übereinstimmungen zu ersetzen.
Wenn einige der zu ersetzenden Zeichenfolgen Teilzeichenfolgen anderer zu ersetzender Zeichenfolgen sind, müssen Sie die Zeichenfolgen im regulären Ausdruck nach absteigender Länge sortieren, d. H.
quelle
$regex
, weil es hier nicht verwendet wird?Bash
Ersetzen Sie das erste Spiel:
Ersetzen Sie alle Übereinstimmungen:
Anfangsübereinstimmung ersetzen:
Endmatch ersetzen:
quelle
Hier ist der GNU
awk
-Einzeiler:Möglicherweise nicht für sehr große Dateien geeignet, da alle Muster zuerst in Arrays gespeichert werden.
Ausgabe:
quelle
quelle