suffix abschneiden

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

suffix abschneiden

Beitrag von MoonKid » 13.03.2012 14:17:58

Hab ja einige docs über Stringverarbeitung hier, aber steh auf dem Schlauch.

Ich möchte den Dateisuffix eines Dateinames abschneiden.

file.txt => file
file.pdf.old.inc.wq.texxxd.org => file.pdf.old.inc.wq.texxxd

Es gibt mehrere Punkte im Dateinamen und die Länge des suffix ist nicht bekannt.

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: suffix abschneiden

Beitrag von Liffi » 13.03.2012 14:26:47

MoonKid hat geschrieben: Ich möchte den Dateisuffix eines Dateinames abschneiden.

file.txt => file
file.pdf.old.inc.wq.texxxd.org => file.pdf.old.inc.wq.texxxd

Es gibt mehrere Punkte im Dateinamen und die Länge des suffix ist nicht bekannt.
In perl mit. Falls das unuebersichtlich aussieht und Erklaerung bedarf einfach fragen.

Code: Alles auswählen

perl -e '@a=qw(file.txt file.pdf.old.inc.wq.texxxd.org); for (@a){$_=~s/\.[^.]*$//;print "$_\n"}'
file
file.pdf.old.inc.wq.texxxd

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: suffix abschneiden

Beitrag von ThorstenS » 13.03.2012 14:29:42

Mit der Bash:

Code: Alles auswählen

$ a="Datei.Name.html.wri"
$ b=${a%.*}
$ echo $b
Datei.Name.html

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: suffix abschneiden

Beitrag von Liffi » 13.03.2012 14:48:19

ThorstenS hat geschrieben:Mit der Bash:

Code: Alles auswählen

$ a="Datei.Name.html.wri"
$ b=${a%.*}
$ echo $b
Datei.Name.html
Hui! Wofuer steht %?

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: suffix abschneiden

Beitrag von ThorstenS » 13.03.2012 14:54:52

Ich poste dir mal meinen bashSubstitution Wikieintrag dazu:

Code: Alles auswählen

Tabelle aus dem LM 02/10
Zeichen:    Bedeutung:                              Beispiel:
#           Einfaches Löschen von vorne             x="aabc": das führende a entfernen ${x#a}
##          Gieriges  Löschen von vorne             x="aabc": alle führenden as entfernen ${x##a}
%           Einfaches Löschen von hinten            x="abcc": das letzte c entfernen ${x%c}
%%          Gieriges  Löschen von hinten            x="abcc": alle c von hinten entfernen ${x%%c}
/           Ändern eines Textes beim 1. Vorkommen   x="abcabc": ${x/b/x} erzeugt axcabc
//          Ändern eines Textes alle Vorkommen      x="abcabc": ${x//b/x} erzeugt axcaxc
^           bash4: 1. Zeichen in Großbuchstaben     x="abc": ${x^a} erzeugt Abc ${x^} wandelt immer den 1. Buchstaben um
^^          bash4: alle Zeichen in Großbuchstaben   analog zu ^
,           bash4: 1. Zeichen in Kleinbuchstaben    analog zu ^
,,          bash4: alle Zeichen in Kleinbuchstaben  analog zu ^


pwd in der bash: MYDIR=${0%/*}

Alle Pfade in $PATH Zeile für Zeile ausgeben: printf ${PATH//:/\\n}

Präfix-Ersetzung:
1) ${VARIABLE%Zeichen}Ersatz - wenn $VARIABLE mit 'Zeichen' endet, lösche dieses und ersetze mit 'Ersatz' (String), wenn vorhanden (wenn weggelassen wird nur gelöscht; gilt für alle Varianten)
2) ${VARIABLE%Zeichen*}Ersatz - lösche alles ab (einschl.) dem letzten Vorkommen von 'Zeichen', ersetze mit 'Ersatz' (s.o.)
3) ${VARIABLE%%Zeichen*}Ersatz - lösche alles ab (einschl.) dem 1. Vorkommen von 'Zeichen', ersetze mit 'Ersatz' (s.o.)
Beispiel:
Alles im aktuellen Verzeichnis, was mit '*.html' endet, soll in '*.htm' umbenannt werden:
ls -1A *.html | while read arg ; do mv $arg ${arg%.html}.htm ; done

Suffix-Ersetzung:
1) ${VARIABLE#Zeichen} - wenn $VARIABLE mit 'Zeichen' beginnt, lösche dieses
2) ${VARIABLE#*Zeichen} - lösche alles bis zum 1. Vorkommen von 'Zeichen' (einschl. 'Zeichen'!)
3) ${VARIABLE##*Zeichen} - lösche alles bis zum letzten Vorkommen von 'Zeichen' (einschl. 'Zeichen'!)
Beispiele:
echo $HOME # Ausgabe: /home/user
echo ${HOME#/} # Ausgabe: home/user
echo ${HOME##*/} # Ausgabe: user
echo ${HOME#*e} # Ausgabe: /user
echo ${HOME##*e} # Ausgabe: r
echo ${HOME#e} # Ausgabe: /home/user

BDAY="21.05.1984"
echo ${BDAY//./} # Ausgabe 21051984 - eliminiert alle Punkte!
echo ${BDAY:0:2} # 21 - also den Tag
echo ${BDAY:3:2} # 05 - also den Monat
echo ${BDAY:6:4} # 1984 - also das Jahr


http://www.tldp.org/LDP/abs/html/refcards.html#AEN18911
Table B-5. String Operations

adr="thorsten-nachname.post@thorstennachname.de"
local="${adr%%@*}"
domain="${adr#*@}"
echo -e "local-part: ${local}\ndomain-part: ${domain}"

Ergibt:
    local-part: thorsten-nachname.post
    domain-part: thorstennachname.de


Jedes Bild von _MG_3423.JPG nach IMG_3423.JPG umbenennen:
for i in _*; do mv $i IMG_${i##*_}; done

Jedes TIFF Bild auf 25% verkleinern und als jpg abspeichern:
for i in ../*tiff; do bild=$(basename $i);bild=${bild%%.*};convert $i -quality 75 -resize 25% $bild.jpg; echo $i; done

Präfix-Ersetzung:
1) ${VARIABLE%Zeichen}Ersatz - wenn $VARIABLE mit 'Zeichen' endet, lösche dieses und ersetze mit 'Ersatz' (String), wenn vorhanden (wenn weggelassen wird nur gelöscht; gilt für alle Varianten)
2) ${VARIABLE%Zeichen*}Ersatz - lösche alles ab (einschl.) dem letzten Vorkommen von 'Zeichen', ersetze mit 'Ersatz' (s.o.)
3) ${VARIABLE%%Zeichen*}Ersatz - lösche alles ab (einschl.) dem 1. Vorkommen von 'Zeichen', ersetze mit 'Ersatz' (s.o.)
Beispiel:
Alles im aktuellen Verzeichnis, was mit '*.html' endet, soll in '*.htm' umbenannt werden:
ls -1A *.html | while read arg ; do mv $arg ${arg%.html}.htm ; done

Suffix-Ersetzung:
1) ${VARIABLE#Zeichen} - wenn $VARIABLE mit 'Zeichen' beginnt, lösche dieses
2) ${VARIABLE#*Zeichen} - lösche alles bis zum 1. Vorkommen von 'Zeichen' (einschl. 'Zeichen'!)
3) ${VARIABLE##*Zeichen} - lösche alles bis zum letzten Vorkommen von 'Zeichen' (einschl. 'Zeichen'!)
Beispiele:
echo $HOME # Ausgabe: /home/user
echo ${HOME#/} # Ausgabe: home/user
echo ${HOME##*/} # Ausgabe: user
echo ${HOME#*e} # Ausgabe: /user
echo ${HOME##*e} # Ausgabe: r
echo ${HOME#e} # Ausgabe: /home/user


Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: suffix abschneiden

Beitrag von Liffi » 13.03.2012 15:02:25

ThorstenS hat geschrieben:Ich poste dir mal meinen bashSubstitution Wikieintrag dazu:
Danke. Das kann sich eines Tages wirklich noch als nuetzlich erweisen. Und ab jetzt erinnere ich mich auch daran.

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: suffix abschneiden

Beitrag von ThorstenS » 13.03.2012 15:04:26

freut mich, wenns dir mal hilft :)

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: suffix abschneiden

Beitrag von Meillo » 13.03.2012 17:02:40

Zur Portabilitaet: Dieses Prefix und Postfix Abschneiden ist nicht nur in der bash moeglich. Schon die ksh unterstuetzt es. Inzwischen ist es auch in POSIX. Allerdings gibt es aeltere Shells die damit nichts anfangen koennen.
Use ed once in a while!

Antworten