Frage

Ich muss, um die Dateien in einem Verzeichnis durchlaufen und führen Sie den folgenden Ersatz.

Vorher:

  

Hallo $ {USER_NAME}, Sie leben auf   $ {HOME_ADDRESS}. Es ist jetzt $ {TIME}

Nach:

  

Hallo $ {Username}, Sie leben auf   $ {} Homeaddress. Es ist jetzt $ {time}

Die Anzahl der verschiedenen Token, die innerhalb von $ {} erscheinen groß ist, so ist es nicht wirklich möglich zu laufen:

find . -name '*' -exec sed -i 's/${USER_NAME}/${userName}/g' {} \;
find . -name '*' -exec sed -i 's/${TIME}/${time}/g' {} \;

etc.

Ich hoffe, dann ist es möglich, diesen Austausch auszuführen, um einen einzigen Befehl, dass etwas wie folgt aussieht:

find . -name '*' -exec sed 's/XXX/YYY/g' {} \;

Aber ich kann nicht herausfinden, was für XXX und YYY zu ersetzen. Ist es möglich, diese in einem einzigen Befehl zu tun?

Cheers, Donal

War es hilfreich?

Lösung

Die -i Flag sed wird eine Datei an Ort und Stelle bearbeiten. Für XXX und YYY würde verwenden Sie so etwas wie:

sed -i 's/USER_NAME/userName/g'

und so weiter.

Update: Ich sehe, dass Ihre Frage wirklich war über „USER_NAME“ in „username“ automatisch zu ändern. Sie können sich das Perl-Skript versuchen:

sub convert {
    my $r = lc $_[0];
    $r =~ s/_(.)/\U$1\E/g;
    return $r;
}
while (<>) {
    s/\${([A-Z_]+)}/\${@{[convert $1]}}/g;
    print;
}

Starten Sie es wie folgt aus:

perl -i convert.pl inputfile.txt

Beispiel für die Ausgabe:

$ cat inputfile.txt
Hello ${USER_NAME}, you live at ${HOME_ADDRESS}. It is now ${TIME}
$ perl -i convert.pl inputfile.txt
$ cat inputfile.txt
Hello ${userName}, you live at ${homeAddress}. It is now ${time}

Andere Tipps

Formatiert für Klarheit:

sed -i '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g 
                   s/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g 
                   s/\$\{TIME\}/\$\{time\}/g
                  }'

Wo /^Hello/ die Linien identifiziert Wunsch zu handeln (es präziser, wenn nötig) und der Rest ersetzt jeden Variablennamen.


Wenn diese in ein Skript zu schreiben, sollten Sie die Verwendung eines HIER Dokument die Formatierung zu halten und macht es leichter zu lesen und zu aktualisieren ...

Die Antwort oben funktioniert wirklich gut. Der Vollständigkeit halber möchte ich hinzufügen, dass Sie tun können:

sed '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g' <filename> \
   | sed 's/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g' \
   | sed 's/\$\{TIME\}/\$\{time\}/g'

Sie sind funktional identisch (außer, dass meine stdout Dumps;. Sie es irgendwo setzen müssen werde (aber Sie bekommen das Original zu halten, falls, wie e, Sie mess up regelmäßig auf Ihrem regexps) Ich mag meine Formulierung, nur weil ich mit dem einem sed-Befehl starten, fügen Sie dann auf mehr mit

!! | sed 'yet-enother-regexp'

Pfeiltasten? vi-Modus? Wer braucht das Zeug? :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top