Ich habe beispielsweise eine Datei map.txt
, die eine Liste von Suchzeichenfolgen und den entsprechenden Ersetzungen enthält:
search -> replacement
bigBone -> bb
fishMarket -> fm
dogCollar -> dc
...
Ich muss für alle Dateien in einem Ordner rekursiv alle Zeichenfolgen suchen und ersetzen, die mit den obigen übereinstimmen, mit Ausnahme symbolischer Links. Ich weiß, wie man das einzeln und so macht:
$ find /some/folder -type f -exec sed -i 's/old_text/new_text/g' {} \;
Wie kann ich dies in großem Maßstab mit der obigen Zuordnung durchführen? Ich habe gelesendiese Frage, aber verstehe es nicht ganz.
Antwort1
Antwort
Wenn Ihnen die Geschwindigkeit egal ist (dies ist eine einmalige Aufgabe), können Sie vielleicht Folgendes versuchen:
cat map.txt | while read line; do
neww=${line##* };
oldw=${line%% *};
find /some/folder -type f -exec sed -i "s/$oldw/$neww/g" {} \;
done
Nicht optimal, ich weiß... :-P
PS: Überprüfen Sie in einem Testordner, ob es funktioniert!
Erläuterung
Grundsätzlich:
- Cat-Datei map.txt.
- Lesen Sie jede Zeile und suchen Sie sich das zu ersetzende Wort
$oldw
und den Ersatz aus$neww
. - Führen Sie für jedes Paar den Suchbefehl aus, den Sie bereits verwendet haben (beachten Sie diesmal die Anführungszeichen, um eine Variablenersetzung zu ermöglichen).
Informationen zur Parametererweiterung
Um die Variablen $oldw
und zu setzen $neww
, müssen wir das erste und das letzte Wort jeder Zeile abrufen. Dazu verwenden wir die Parametererweiterung (reine Bash-Implementierung), obwohl wir auch andere Möglichkeiten hätten verwenden können, um das erste und das letzte Wort des Strings abzurufen (z. B. cut
oder awk
).
${line##* }
: Entfernen Sie aus der Variableline
das größte Präfixmuster (doppeltes#
), wobei das Muster aus beliebigen Zeichen (*
) gefolgt von einem Leerzeichen () besteht. So erhalten wir das letzte Wort in
line
.${line%% *}
: Entfernen Sie aus der Variableline
das größte Suffixmuster (doppeltes%
), wobei das Muster ein Leerzeichen () gefolgt von beliebigen Zeichen (
*
) ist. So erhalten wir das erste Wort inline
.
In diesem Fall wurden die Wörter durch ein Leerzeichen getrennt, wir hätten jedoch jedes beliebige Trennzeichen verwenden können.
Antwort2
Manchmal muss ich Begriffe in Konfigurationsdateien suchen und ersetzen.
Ich habe ein Skript geschrieben, das auf GitHub verfügbar istsandr - suchen und ersetzenDies ermöglicht das Erstellen/Verwenden einer Karte und das Ersetzen in Dateien.
Ein Anwendungsbeispiel:
$ cat file
Voyez ce jeu exquis wallon, de graphie en kit mais bref. Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce qui lui permet de penser à la cænogenèse de l'être dont il est question dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, pense-t-il, diminue çà et là la qualité de son œuvre. Prouvez, beau j
$ cat map.txt
wallon => WALLON
se => SE
penser => PENSER
beau => BEAU
$ cat file | ./sandr -a map.txt
Voyez ce jeu exquis WALLON, de graphie en kit mais bref. Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à côté de l'alcôve ovoïde, où les bûches SE consument dans l'âtre, ce qui lui permet de PENSER à la cænogenèSE de l'être dont il est question dans la cauSE ambiguë entendue à Moÿ, dans un capharnaüm qui, penSE-t-il, diminue çà et là la qualité de son œuvre. Prouvez, BEAU j