Antwort

Antwort

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:

  1. Cat-Datei map.txt.
  2. Lesen Sie jede Zeile und suchen Sie sich das zu ersetzende Wort $oldwund den Ersatz aus $neww.
  3. 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 $oldwund 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. cutoder awk).

  • ${line##* }: Entfernen Sie aus der Variable linedas 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 Variable linedas größte Suffixmuster (doppeltes %), wobei das Muster ein Leerzeichen ( ) gefolgt von beliebigen Zeichen ( *) ist. So erhalten wir das erste Wort in line.

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

verwandte Informationen