
Ich habe versucht, eine Zeile durch eine andere zu ersetzen, indem ich SED
on verwende MAC OS X Terminal
. Ich habe ein Szenario, in dem ich eine Zeile in allen in einem Verzeichnis vorhandenen Dateien durch eine andere Zeile ersetzen muss. Beide Zeilen sind komplex und haben unterschiedliche Sonderzeichen und Symbole.
Wie kann ich es ersetzen?
Ich muss ersetzen
import { wait } from 'path/and-child-path'
mit
import { wait } from 'path/path/and-child-path'
Was ich versucht habe ist
find . -type f | xargs sed -i '' "s@import { wait } from 'path/and-child-path'@import { wait } from 'path/and-child-path'@g"
Das funktioniert nicht. Bitte helfen Sie mir.
Antwort1
Das sed
von Ihnen bereitgestellte hat genau dasselbe Match-and-Replace-Muster (falls das kein Tippfehler war), Sie können also keine Änderung in den Dateien erwarten. Außerdem ''
sollte das Bit nicht da sein.
Durch die Korrektur dieser Punktewürdeenden mit
find . -type f | xargs sed -i \
"s@import { wait } from 'path/and-child-path'@import { wait } from 'path/path/and-child-path'@g"
Dieser Code wird trotzdem fehlschlagenim Allgemeinen, weil Dateinamen Leerzeichen (und sogar Zeilenumbrüche!) enthalten können, die genau das sind, was xargs
als Trennzeichen verwendet wird. Wenn Sie also die Datei haben A X
, sed
wird angewiesen, auf die Dateien A
und zu reagieren X
.
-exec
Option löst das Problem direkt:
find . -maxdepth 1 -type f -exec sed -i \
"s@import { wait } from 'path/and-child-path'@import { wait } from 'path/path/and-child-path'@g" {} +
Beachten Sie, dass ich auch hinzugefügt habe -maxdepth 1
, da sonst find
auch in Unterverzeichnisse gewechselt würde.