[solved] Alles ab letztem . löschen - es geht sicher mit sed - aber wie

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
speefak
Beiträge: 532
Registriert: 27.04.2008 13:54:20

[solved] Alles ab letztem . löschen - es geht sicher mit sed - aber wie

Beitrag von speefak » 29.04.2018 23:52:50

Hallo, ich schreibe gerade ein kleines Script um Audiospuren aus Videodateien ohne Neuconvertierung zu extrahieren.

Code: Alles auswählen

VideoInputFileTypes="mkv mp4 mpg mpeg avi flv mp3 mov m4a 3gp 3g2 mj2"

	SAVEIFS=$IFS
	IFS=$(echo -en "\n\b")
	for i in $(ls | grep "$(echo $VideoInputFileTypes | sed 's/ /\$\\|/g')") ;do 

		AudioLaneType=$(ffprobe "$i"  2>&1 | grep "Audio: " | awk -F "Audio: " '{print $2}' | cut -d " " -f1 | head -n1)
		mplayer -dumpaudio $i
		mv stream.dump $(echo $i |sed 's/.\{3\}$/'$AudioLaneType'/')

 		#alternative but errors with spaces in filenames
		#avconv -y -i "$i" -acodec copy "$i".$AudioLaneType || echo invalid file: $i
		
	done
	IFS=$SAVEIFS
Das funktioniert soweit alles bis auf eine Sache : Es gibt Dateiendungen mit 4 Buchstaben wie z..b mpeg.
Für das Umbenennen mit der entsprechen Audiospurendung nach dem codec der Audiospur der Video Datei ( aac Audiospur = acc Dateiendung , ac3 Audiospur = .ac3 Endung ) sollte alles nach dem letzten Punkt des Dateinamens gelöscht werden.

Code: Alles auswählen

sed 's/.\{3\}$/'$AudioLaneType'/'
löscht jedoch nur die letzten 3 Zeichen nach dem letzten Punkt und somit bleibt bei mpeg dann .m stehen.

Wie kann ich mit sed ALLES was nach dem letzten Punkt folgt löschen ?
Zuletzt geändert von speefak am 30.04.2018 13:55:54, insgesamt 1-mal geändert.

tobo
Beiträge: 2338
Registriert: 10.12.2008 10:51:41

Re: Alles ab letztem . löschen - es geht sicher mit sed - aber wie

Beitrag von tobo » 30.04.2018 00:19:12

Das dürfte das sein, was du willst:

Code: Alles auswählen

sed "s/\.[^.]*$/.$AudioLaneType/"
Das dürfte das sein, was du fragst:

Code: Alles auswählen

sed 's/\.[^.]*$/./'

rodney
Beiträge: 370
Registriert: 09.12.2016 04:15:59

Re: Alles ab letztem . löschen - es geht sicher mit sed - aber wie

Beitrag von rodney » 30.04.2018 01:36:17

Code: Alles auswählen

mv stream.dump $(echo $i |sed 's/.\{3\}$/'$AudioLaneType'/')
Alternativ (mit bash):

Code: Alles auswählen

mv stream.dump ${i%.*}.

Benutzeravatar
speefak
Beiträge: 532
Registriert: 27.04.2008 13:54:20

Re: Alles ab letztem . löschen - es geht sicher mit sed - aber wie

Beitrag von speefak » 30.04.2018 13:55:33

das wars :

Code: Alles auswählen

sed "s/\.[^.]*$/.$AudioLaneType/"

mv stream.dump ${i%.*}. macht aus "stream.dump" "aac." - passt nicht so "ganz".

Gunman1982
Beiträge: 923
Registriert: 09.07.2008 11:50:57
Lizenz eigener Beiträge: MIT Lizenz

Re: [solved] Alles ab letztem . löschen - es geht sicher mit sed - aber wie

Beitrag von Gunman1982 » 02.05.2018 13:45:13

Warum mit sed? Sieht nach einem bash skript aus.

man bash:

Code: Alles auswählen

       ${parameter%word}
       ${parameter%%word}
              Remove matching suffix pattern.  The word is expanded to produce a pattern just as in pathname expansion.  If the pattern matches a trailing portion of the expanded value of  parameter,  then
              the  result of the expansion is the expanded value of parameter with the shortest matching pattern (the ``%'' case) or the longest matching pattern (the ``%%'' case) deleted.  If parameter is
              @ or *, the pattern removal operation is applied to each positional parameter in turn, and the expansion is the resultant list.  If parameter is an array variable subscripted with @ or *, the
              pattern removal operation is applied to each member of the array in turn, and the expansion is the resultant list.

Benutzeravatar
speefak
Beiträge: 532
Registriert: 27.04.2008 13:54:20

Re: [solved] Alles ab letztem . löschen - es geht sicher mit sed - aber wie

Beitrag von speefak » 04.05.2018 12:41:04

weil sed mehr "kann" und ich mir dann nur eine syntax merken muss.

Besteht in der Bash die Möglichkeit mit "Variablen" wie sed zu arbeiten in dem alles nach dem letzten Punkt im Dateinamen gelöscht wird, egal welcher String nach dem Punkt folgt ?

tobo
Beiträge: 2338
Registriert: 10.12.2008 10:51:41

Re: [solved] Alles ab letztem . löschen - es geht sicher mit sed - aber wie

Beitrag von tobo » 04.05.2018 13:13:57

speefak hat geschrieben: ↑ zum Beitrag ↑
04.05.2018 12:41:04
Besteht in der Bash die Möglichkeit mit "Variablen" wie sed zu arbeiten in dem alles nach dem letzten Punkt im Dateinamen gelöscht wird, egal welcher String nach dem Punkt folgt ?
sed hat nur deshalb die Möglichkeit mit Variablen zu arbeiten, weil die Shell (in deinem Fall die Bash) diese Möglichkeit bietet.

Code: Alles auswählen

$ AudioLaneType=ac3; var=MeineDatei.mpeg; echo "$var"; echo "${var%.*}"; echo "${var/%.*/.}"; echo "${var/%.*/.$AudioLaneType}"
Siehe auch "man bash" und dann mit / nach "Parameter Expansion" suchen.
EDIT: Code ergänzt


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

Re: Alles ab letztem . löschen - es geht sicher mit sed - aber wie

Beitrag von Meillo » 04.05.2018 14:07:55

rodney hat geschrieben: ↑ zum Beitrag ↑
30.04.2018 01:36:17
Alternativ (mit bash):

Code: Alles auswählen

mv stream.dump ${i%.*}.
Das geht nicht nur in der Bash, sondern portabel ueber alle POSIX Shells. Dies ist die Variante, die ich waehlen wuerde.
Use ed once in a while!

Antworten