Ich habe eine Datei mit einer Liste von Ersatzpaaren (etwa 100 von ihnen), die von sed
verwendet werden, um Zeichenfolgen in Dateien zu ersetzen.Shell-Skript für mehrere sed Ersetzungen optimieren
Die Paare gehen wie:
old|new
tobereplaced|replacement
(stuffiwant).*(too)|\1\2
und meine aktuellen Code ist:
cat replacement_list | while read i
do
old=$(echo "$i" | awk -F'|' '{print $1}') #due to the need for extended regex
new=$(echo "$i" | awk -F'|' '{print $2}')
sed -r "s/`echo "$old"`/`echo "$new"`/g" -i file
done
ich nicht denken helfen kann, aber dass es eine optimalere Weise die Ersetzungen durchzuführen. Ich habe versucht, die Schleife umzudrehen, um zuerst durch die Zeilen der Datei zu laufen, aber das erwies sich als viel teurer.
Gibt es andere Möglichkeiten, dieses Skript zu beschleunigen?
EDIT
Vielen Dank für die schnellen Antworten. Lassen Sie mich die verschiedenen Vorschläge ausprobieren, bevor Sie eine Antwort wählen.
Eine Sache zu klären: Ich brauche auch Teilausdrücke/Gruppen Funktionalität. Zum Beispiel ist ein Ersatz ich brauchen könnte:
([0-9])U|\10 #the extra brackets and escapes were required for my original code
Einige Details zu den Verbesserungen (aktualisiert werden):
- Methode: Bearbeitungszeit
- Original-Skript: 0.85s
- statt
awk
: 0,71s - anubhavas Methode: 0.18s
- chthonicdaemon Methode: 0,01s
Diese Frage hat Antworten [hier] (http://stackoverflow.com/questions/25329309). Ja, Sie suchen nach Geschwindigkeit, aber bitte, warum zwei Fragen. – martin
Um ehrlich zu sein, bringt diese Frage nicht wirklich das Element der Geschwindigkeit oder der Teilausdrücke zum Ausdruck. Die Antworten, die hier gegeben wurden, waren viel hilfreicher. –
Ok, dann klären Sie Ihre Frage in Bezug auf die Teilausdrücke, indem Sie sie in den Daten platzieren und Eingabe und gewünschte Ausgabe bereitstellen, die Ihre Frage stark verbessern und klar von den anderen unterscheiden. – martin