PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [BASH] vor Großbuchstaben einen Unterstrich einfügen



boba
21-03-2006, 07:23
Ich hab mal wieder eine aufgabe für sed und co.
Ich habe verschiedene Ordner oder Dateinamen die folgendermassen aufgebaut sind BlaBlub.gif, HalliHallo und rauskommen soll dann Bla_Blub.gif, Halli_Hallo.

und gleichzeitig gibt es datei/ordner-Namen die nach einem Unterstrich einen Großbuchstaben haben sollen, inkl. erstes Zeichen
z.B. mama_papa.gif zu Mama_Papa.gif.

Wie ich die Grßbuchstaben oder unterstriche finde ist mir klar, aber dann anhand dieser eine Aktion durchführen nicht so ganz.

Als Denksport Aufgabe dazu wäre eine möglichkeit schöm den letzten punkt auch noch auf eine Spalte in einer mysql Tabelle anzwenden...:p

EDIT: eine Ansatz scheint zu sein das man wohl jeden Großbuchstaben innerhalb eines Strings durch "_[A-Z]" ersetzen könnte

danke

peschmae
21-03-2006, 11:46
Ich glaub mit dem Sed-Kommando "y" sollte das zu machen sein.

MfG Peschmä

Romanday
21-03-2006, 23:24
Ich hab mal wieder eine aufgabe für sed und co.
danke

Das ist kein Code kaum raus Forum.:D
Ich glaube so einfach wie Du dir vorstellst ist es das nicht.
1.) bist du dir sicher das es die Dateinamen immer denselben Aufbau haben?
2.) Wie sollen Fehler abgefangen werden? Soll eventuelle eine Datei
überschieben werden.
3.) Wenn du schon so etwas progst, kannste Du eventuelle Sonderzeichen
auf gleich mit ersetzten.

Das kannst du alles mit einer handelüblichen Scriptsprache lösen,
welche REGEX unterstützt.


nur noch anpassen->
http://www.michael-berndt.de/ie/tux/umbenennen.sh.htm

boba
22-03-2006, 07:56
Das ist kein Code kaum raus Forum.:D

ist auch nicht so gedacht, mein hauptproblem ist dabei wie ich jeden Buchstaben
anschaue und nicht den gesamten string.

ich habe mal ein script umgebastelt das alle Großbuchstaben in kleine umwandelt , dieses scheint eine BAsis für, mdas aktuelle problem zu sein.

lower2.sh


#!/bin/bash
#
PWD2=$(pwd)
echo $PWD2
/usr/bin/find "$PWD2" -type f -name "*[A-Z]*" -print0 -exec ./lower.sh {} \; | xargs -0 -n2 mv -i
exit 0
lower.sh


x="`dirname "$*"`/`basename "$*" | tr "[:upper:] " "[:lower:]_"`"
echo -ne "$x\000"

das "[:upper:] " "[:lower:]_"` muss anscheinend so umgebaut werden das es nicht kleiner macht sonder halt _[A-Z] einsetzt...

Romanday
22-03-2006, 10:43
das "[:upper:] " "[:lower:]_"` muss anscheinend so umgebaut werden das es nicht kleiner macht sonder halt _[A-Z] einsetzt...

Jein,

nach der Konvertierung kann es doppelte Dateinamen geben, was passiert
dann?
Soll auch _Datei.mb,_Da_Ds_.mb oder __Datei.mb gültig sein?

boba
22-03-2006, 12:51
Jein,

nach der Konvertierung kann es doppelte Dateinamen geben, was passiert
dann?
Soll auch _Datei.mb,_Da_Ds_.mb oder __Datei.mb gültig sein?
Nein, man müsste den ersten Buchstaben zwar in einen Großbuchstaben wandeln aber halt den unterstrich vermeiden.
Bei doppelten Dateinamen sollte er den 1ten im Original Zustand lassen, bissl handarbeit schadet nicht.

wie kann ich den bei sed den gerade mit S// ausgeschnittenen Buchstaben extrahieren?

"ls HalLo.gif | sed 's/[A-Z]/_/g'" ersetzt alle Großbuchstaben mit _ was ja schon ein viertel der Miete ist.
mit sed 's/[A-Z]/_/2' könnte ich z.B. den ersten GB ignorieren, leider kann man damit nur eine Stelle und nicht "ab" angeben

peschmae
22-03-2006, 15:27
Ich spinne den Faden mal etwas weiter:


echo HalLoDuSedBenutzer.gif | sed 's/\([A-Z]\)/_\1/2g'

ergibt:
Hal_Lo_Du_Sed_Benutzer.gif

MfG Peschmä

boba
22-03-2006, 16:01
perfekt fett, danke.
Ich hab die Nummern ganz vergessen und gerade mal versucht ein [digit] einzusetzen


echo HalLoDuSedBenutzer3.gif | sed 's/\([:digit:]\)/_\1/2g'
HalLoDuSedBenu_tzer3._g_if

hab die Syntax wohl noch nicht gant begriffen :(

aber so gehts.


echo HalLoDuSedBenutzer3.gif | sed 's/\([0-9]\)/_\1/g'

Joghurt
22-03-2006, 16:04
sed 's/\(.\)\([A-Z]\)/\1_\2/g'funktioniert im Gegensatz zu peschmae's Beispiel auch mit Dateinamen, die nicht mit einem Großbuchstaben beginnen richtig.

(OK, README.txt wird zu R_E_A_D_M_E.txt, aber das soll laut spezifikation ja auch so sein)

@boba: [A-Z] einfach durch [A-Z0-9] ersetzen

TheReaper
23-03-2006, 09:25
Hab mal ein Script für die beiden Anforderungen ('A'->'_A' und '_a'->'_A') geschrieben:


#!/bin/bash

for file in *
do
mv "$file" "`echo $file | perl -pe 's/([^_])([A-Z0-9])/$1_$2/g; s/(^|_)([a-z])/$1\u$2/g;'`"
done
Das erste s///g setzt vor die Großbuchstaben einen Unterstrich (keine doppelten, falls schon ein Unterstrich vorhanden ist). Die zweite Ersetzung wandelt Kleinbuchstaben am Anfang oder nach einem Unterstrich in Großbuchstaben um. Ist in Perl IMHO am einfachsten, da die Konvertierungen Klein-Großschreibung eines einzelnen Buchstabens in sed und awk nicht oder nur umständlich machbar sind.

Eventuelle Fehler bitte melden. ;)

mfG