![[tr][tr]{X} in einer langen Dateiliste innerhalb von Bash in [tr][tr]{\tinyX} ändern?](https://rvso.com/image/164480/%5Btr%5D%5Btr%5D%7BX%7D%20in%20einer%20langen%20Dateiliste%20innerhalb%20von%20Bash%20in%20%5Btr%5D%5Btr%5D%7B%5CtinyX%7D%20%C3%A4ndern%3F.png)
Neuling hier. Ich versuche, ein Bash-Skript zu programmieren, das für jede Datei in einem Ordner die folgende Sequenz ersetzt:
[tr][tr]{X}
wobei X eine beliebige Dezimalzahl (Sammlung von Ziffern und ".") ist, durch
[tr][tr]{\tinyX}
.
Irgendwelche Ideen?
Danke
Antwort1
Wenn Sie keinen Zugriff auf GNU haben sed
, können Sie auch perl
(which is -i
GNU sed
actually borrowed) verwenden:
find . -type f -exec perl -Tpi -e 's/\Q[tr][tr]{\E\K[\d.]+\}/\\tiny$&/g' {} +
Antwort2
Bei GNU sed
Verwendung des globalen Ersetzungsmusters s/regexp/replacement/g
:
sed -i'' 's/\(\[tr\]\[tr\]{\)\([0-9.]\+}\)/\1\\tiny\2/g' /path/to/folder/*
Dies erfasst die Zeichenfolge [tr][tr]{
in einer Gruppe und X
enthält mindestens eine Ziffer oder .
(Klammerausdruck [0-9.]\+
, der \+
die Zeichen innerhalb der Klammern ein- oder mehrmals abgleicht), gefolgt vom Schließen }
in einer zweiten Gruppe und ersetzt die übereinstimmenden Teile durch die erste Gruppe \tiny
und die zweite Gruppe in jeder Zeile. Die Klammern ()
für die Gruppen, die wörtlichen Klammern []
und +
der wörtliche Backslash \
müssen mit einem weiteren Backslash maskiert werden.
Denken Sie daran, vor dem Ausführen dieses Befehls eine Sicherungskopie Ihres Datenordners zu erstellen (oder verwenden Sie -i.back
anstelle von , -i''
um die Originale als beizubehalten filename.back
).