[gelöst] Verzeichnispfad mit Script "zerteilen" via sed??

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
synapsenstau
Beiträge: 172
Registriert: 08.10.2013 09:56:34
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Südharz

[gelöst] Verzeichnispfad mit Script "zerteilen" via sed??

Beitrag von synapsenstau » 27.02.2014 18:37:08

Hi,

ich habe hier dieses Script im Netz gefunden:

Code: Alles auswählen

#!/bin/sh

# This script tells about song played in amarok2
message="/me is listening silence now"
nowPlaying="$(qdbus org.kde.amarok /Player org.freedesktop.MediaPlayer.GetMetadata 2>/dev/null)"

if [ -n "${nowPlaying}" ]
then
	title="$(echo "${nowPlaying}" | sed -ne 's/^title: \(.*\)$/\1/p')"
	artist="$(echo "${nowPlaying}" | sed -ne 's/^artist: \(.*\)$/\1/p')"
	message="/me is listening now: ${artist} - ${title}"
fi

echo "${message}"

welches auch soweit funktioniert. Ich wollte es aber ein wenig an meine Bedürfnisse anpassen. Ich habe herausgefunden, das man mit qbus mehr erfahren kann:

Code: Alles auswählen

xx@xx:~$ qdbus org.kde.amarok /Player org.freedesktop.MediaPlayer.GetMetadata
album: Goa Beach Vol. 22 WEB
albumartist: Various Artists
artist: Avshi
arturl: file:///media/fs/av/audio/goa/2014/sampler/VA_-_Goa_Beach_Vol._22-YSE324DCD-WEB-2014-FYM/00-va_-_goa_beach_vol._22-yse324dcd-web-2014-fym.jpg
audio-bitrate: 320
audio-samplerate: 44100
comment: FYM WAS HERE
genre: Psychedelic
location: file:///media/fs/av/audio/goa/2014/sampler/VA_-_Goa_Beach_Vol._22-YSE324DCD-WEB-2014-FYM/04-avshi_-_lost_in_trancelation-fym.mp3
mtime: 473000
rating: 0
time: 473
title: Lost in Trancelation
tracknumber: 4
year: 2014

Ich hätte nun noch gerne das Verzeichnis (VA_-_Goa_Beach_Vol._22-YSE324DCD-WEB-2014-FYM) und den Dateinamen (04-avshi_-_lost_in_trancelation-fym.mp3) je in einer Variable. Leider ist das Problem dabei, das ich mit "sed" nicht zurechtkomme :( und wie ich
location: file:///media/fs/av/audio/goa/2014/sampler/VA_-_Goa_Beach_Vol._22-YSE324DCD-WEB-2014-FYM/04-avshi_-_lost_in_trancelation-fym.mp3
zerteile.
Habe jetzt schon mehrere Wiki's/Howto's und immer noch nicht begriffen, wie ich die info da "extrahieren" kann.

Vielleicht kann mir ja jemand mit netterweise einen Tip geben

Grüße Syn
Zuletzt geändert von synapsenstau am 27.02.2014 20:23:01, insgesamt 1-mal geändert.
..::: Intel® Core™ i5-6600 :::..::: 16 GB Ram :::..
..::: 1 TB Nvme :::..::: 1 TB SSD :::..::: NVIDIA GeForce GTX 1070 :::.

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: Verzeichnispfad mit Script "zerteilen" via sed??

Beitrag von newdeb » 27.02.2014 20:03:37

Dafür genügt Parameter-Expansion:

Code: Alles auswählen

VAR1="... hier steht die location - Zeile ..."
VAR2=${VAR1##*/}
VAR3=${VAR1%/$VAR2}
VAR4=${VAR3##*/}
VAR2 und VAR4 enthalten das Gewünschte.

Benutzeravatar
synapsenstau
Beiträge: 172
Registriert: 08.10.2013 09:56:34
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Südharz

Re: Verzeichnispfad mit Script "zerteilen" via sed??

Beitrag von synapsenstau » 27.02.2014 20:22:26

Habe gerade an anderer stelle diese Lösung gekriegt, die mir das liefert was ich brauche:
Dateiname:

Code: Alles auswählen

qdbus ... | awk -F/ '/^location:/ {print $(NF)}'
Verzeichniss:

Code: Alles auswählen

qdbus ... | awk -F/ '/^location:/ {print $(NF-1)}'
Ist dann halt nur "awk" und nicht "sed"....

Danke für deine mühen
..::: Intel® Core™ i5-6600 :::..::: 16 GB Ram :::..
..::: 1 TB Nvme :::..::: 1 TB SSD :::..::: NVIDIA GeForce GTX 1070 :::.

NearlyRandom
Beiträge: 23
Registriert: 22.09.2012 00:49:42

Re: [gelöst] Verzeichnispfad mit Script "zerteilen" via sed?

Beitrag von NearlyRandom » 27.02.2014 22:40:19

hatte vor 2 Jahre mal was ähnliches für den VLC geskriptet. Ist ja beides MPRIS.
ist alter Code, würde ich heute anders schreiben, muss sicher auch angepasst werden.
License: GPLv3+

Code: Alles auswählen

#!/bin/bash
# by 51 -  2012.05.18, 2012.06.08, 2012.06.17
# dependencies: mdbus2
# Licence : GPL v3


###   --  to configure:  --   ###
###   at [ Settings / All / Interface / Control Interface ] tick [ "D-Bus control Interface" ]   ###


process="$(ps -eF | grep -E '( vlc | vlc$)' | grep -v grep | grep -v "$(echo $0 | sed 's/\.\///g')")"


HELP()
{
echo -e\

exit 0
}


# yet unused
GETOPT()
{
if [ "$param" == "$@" ]; then param="$(echo "$@" | sed 's/^ *'"$1"'\(.*\)$/\1/' 2>/dev/null)"; fi
if [ ! "$(echo "$param" | sed 's/^.*-'"$opt"'.*$//' 2>/dev/null)" ]; then
	next="$(echo "$param" | sed 's/^.*-'"$opt"'\(.\).*$/\1/' 2>/dev/null)"
	ex="$(echo "$param" | sed 's/^.*-'"$opt"'.\(.*$\)/\1/;s/^\([^'"$next"']*\)'"$next"'.*$/\1/' 2>/dev/null)"
	param="$(echo "$param" | sed 's/\(^.*-'"$opt"'\).'"$ex"'\(.*$\)/\1\2/;s/\(^.*-'"$opt"'\).\(.*$\)/\1\2/;s/\(^.*\)-'"$opt"'\(.*$\)/\1\2/' 2>/dev/null)"
	next=""; opt=""
fi
}


DBUS()
{
path="$(echo $metadata | grep \"location\" | sed 's|^.*location": "file://\([^"]*\)".*$|\1|' | echo -e $(sed 's/%/\\\x/g'))"
seconds="$(echo "$metadata" | grep \"time\" | sed 's|^.*"time": \(.*\)$|\1|;s|^\([^,]*\)*,.*$|\1|')"
imgpath="$(echo "$metadata" | grep \"arturl\" | sed 's|^.*arturl": "file://\(.*\).*$|\1|;s|".*$||' | echo -e $(sed 's/%/\\\x/g') | sed '/^$/d')"
artist="$(echo "$metadata" | grep \"artist\" | sed 's|^.*artist": "\(.*\).*$|\1|;s|".*$||')"
album="$(echo "$metadata" | grep \"album\" | sed 's|^.*album": "\(.*\).*$|\1|;s|".*$||')"
title="$(echo "$metadata" | grep \"title\" | sed 's|^.*title": "\(.*\).*$|\1|;s|".*$||')"
genre="$(echo "$metadata" | grep \"genre\" | sed 's|^.*genre": "\(.*\).*$|\1|;s|".*$||')"
tracknumber="$(echo "$metadata" | grep \"tracknumber\" | sed 's|^.*tracknumber": "\(.*\).*$|\1|;s|".*$||')"
year="$(echo "$metadata" | grep \"date\" | sed 's|^.*date": "\(.*\).*$|\1|;s|".*$||')"
encoder="$(echo "$metadata" | grep \"encodedby\" | sed 's|^.*encodedby": "\(.*\).*$|\1|;s|".*$||')"

position="$(mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.PositionGet 2>/dev/null | echo $(sed 's/( //;s/ )//')/1000 | bc)"
volumeget="$(mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.VolumeGet | sed 's/( //;s/ )//')"
vlcversion="$(mdbus2 org.mpris.vlc / org.freedesktop.MediaPlayer.Identity | sed 's/( "vlc //;s/" )//')"
playlistlength="$(mdbus2 org.mpris.vlc /TrackList org.freedesktop.MediaPlayer.GetLength | sed 's/( //;s/ )//')"
playlistnumber="$(mdbus2 org.mpris.vlc /TrackList org.freedesktop.MediaPlayer.GetCurrentTrack | sed 's/( //;s/ )//')"
}


VolumeSet()
{
vol=""
if [ ! "$(echo "$2" | sed 's/^$/<abc>/;s/^[[:digit:]]*$//')" ]; then vol="$(printf "%01d" "$(echo $2)")"; else exit 1; fi
p="\<$vol\>"

# VLC zeigt das 4x-fache an
if [[ $(echo {0..100}) =~ $p ]]; then mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.VolumeSet $vol >/dev/null; else exit 1; fi
exit 0
}


PositionSet()
{
# Test ob Zahl vorliegt
if [[ "$(echo "$2" | grep [[:digit:]])" ]]; then positionset="$(printf "%01d" "$(echo $2)")"; else exit 1; fi
# Test ob gueltige Positionsangabe
if [ ! 0 -le "$positionset" ]; then exit 1; fi
if [ ! "$positionset" -le "$seconds" ]; then exit 1; fi

mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.PositionSet "$(echo $(echo $positionset)*1000 | bc)" >/dev/null
exit 0
}


Duration()
{
minutes="$(printf "%02d" $(echo $seconds/60 | bc))"
fractsec="$(printf "%02d" $(echo $seconds-$minutes*60 | bc))"
hours="$(printf "%02d" $(echo $minutes/60 | bc))"
fractmin="$(printf "%02d" $(echo $minutes-$hours*60 | bc))"
duration="$(echo $hours:$fractmin:$fractsec | sed ':b;s/^0*://;tb;s/^00$//')"
seconds="$(printf "%01d" $seconds)"
minutes="$(printf "%01d" $minutes)"
hours="$(printf "%01d" $hours)"
}


AddTrack()
{
if [ ! -f "$2" ]; then exit 1; fi
mdbus2 org.mpris.vlc /TrackList org.freedesktop.MediaPlayer.AddTrack file://"$2" $switch >/dev/null
exit 0
}


#DelTrack()
#{
#if [ ! -f "$2" ]; then exit 1; else echo yay; fi
#mdbus2 org.mpris.vlc /TrackList org.freedesktop.MediaPlayer.DelTrack file://"$2"
#exit 0
#}


ConkyPicture()
{

###  Pfad zum Alternativbild für Conky (wird übermittelt wenn VLC nicht läuft)  ###
aimgpath=""
###  Pfad zum Alternativbild für Conky (wird übermittelt wenn kein Cover gefunden wurde)  ###
nimgpath=""

if [ "$vlc" == "notrun" ]; then imgpath="$aimgpath"; fi
if [ "$vlc" == "running" ]; then if [ ! "$imgpath" ]; then imgpath="$nimgpath"; fi; fi
if [ "$imgpath" ]
	then options="$(echo $@ | sed 's/'"$1"' *//')"
		if [ ! "$options" ]; then options="$(echo " }")"; else  options="$(echo -e \ $options\ })"; fi
		cimgpath="$(echo "$(echo \"$imgpath\" | sed 's/^/\$\{image /')"$options | sed 'N;s/\n//')"
	else cimgpath=""
fi
}


Conkysetnocovpic()
{
if [ ! -z "$2" ]
then sed -e 's/^\(nimgpath="\)[^"]*"\(.*\)$/\1'"$(echo $2 | sed 's/\//\\\//g;s/&/\\\&/g;s/#/\\\#/g;s/\$\([^ ]\)/\\\$\1/g;s/ /\\\ /g')"'"\2/' $0 > .$0; rm $0; mv .$0 $0; chmod +rwx $0; echo Der Dateipfad des No-Cover-Found-Bildes fuer Conky wurde gespeichert.
else sed -e 's/^\(nimgpath="\)[^"]*"\(.*\)$/\1"\2/' $0 > .$0; rm $0; mv .$0 $0; chmod +rwx $0; echo Der Dateipfad des No-Cover-Found-Bildes fuer Conky wurde resettet.
fi; exit 0
}


Conkysetaltpic()
{
if [ ! -z "$2" ]
then sed -e 's/^\(aimgpath="\)[^"]*"\(.*\)$/\1'"$(echo $2 | sed 's/\//\\\//g;s/&/\\\&/g;s/#/\\\#/g;s/\$\([^ ]\)/\\\$\1/g;s/ /\\\ /g')"'"\2/' $0 > .$0; rm $0; mv .$0 $0; chmod +rwx $0; echo Der Dateipfad des Alternativbildes fuer Conky wurde gespeichert.
else sed -e 's/^\(aimgpath="\)[^"]*"\(.*\)$/\1"\2/' $0 > .$0; rm $0; mv .$0 $0; chmod +rwx $0; echo Der Dateipfad des Alternativbildes fuer Conky wurde resettet.
fi; exit 0
}


Play()
{
case "$(mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.GetStatus | sed 's/^[^,]*\(.\),[^,]*,[^,]*,[^,]*$/\1/')" in
	"0")	if [ "$play" == "off" ]; then mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.Pause >/dev/null; fi;;
	"1")	if [ "$play" == "on" ]; then mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.Pause >/dev/null; fi;;
	"2")	if [ "$play" == "on" ]; then mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.Play >/dev/null; fi
		# kurzer Start mit darauf folgendem Pausieren
		if [ "$play" == "off" ]; then mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.Play >/dev/null; mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.Pause >/dev/null; fi;;
esac
exit 0
}

TrackList()
{
tracklist=1
if [ "$3" ]; then param="$(echo "$3" | sed 's/^-\(-.*\)$/\1/;s/^-\(.\)\(.*\)$/-\u\1\L\2/')"; else exit 1; fi
if [[ "$(echo "$2" | grep [[:digit:]] | grep -v [[:alpha:]])" ]]; then track="$(printf "%01d" "$(echo $2)")"; else exit 1; fi
metadata="$(mdbus2 org.mpris.vlc /TrackList org.freedesktop.MediaPlayer.GetMetadata $track)"
DBUS $@; Player $@
}


Player()
{
case $param in
	"-Path") echo "$path"; exit 0;;
	"-Seconds") echo $seconds; exit 0;;
	"-Minutes") Duration; echo $minutes; exit 0;;
	"-Hours") Duration; echo $hours; exit 0;;
	"-Duration") Duration; echo $duration; exit 0;;
	"-Picture") echo $imgpath; exit 0;;
 	"-Artist") echo $artist; exit 0;;
	"-Album") echo $album; exit 0;;
	"-Title") echo $title; exit 0;;
	"-Genre") echo $genre; exit 0;;
	"-Tracknumber") echo $tracknumber; exit 0;;
	"-Year") echo $year; exit 0;;
	"-Encoder") echo $encoder; exit 0;;
esac

if [ "$tracklist" == 1 ]; then exit 1; fi

case $param in
	"-File") process="$(echo "$process" | sed 's/^[^/]*$//g')"; echo "${process##*/}"; exit 0;;
	"-Files") echo "$process" | sed 's/^[^/]*$//g;s/^.*\/\([^/]*\)$/\1/g;/^$/d'; exit 0;;
	"-Conkypicture") vlc=running; ConkyPicture $@; echo $cimgpath; exit 0;;
	"-Conkysetaltpic") Conkysetaltpic;;
	"-Volumeget") echo $volumeget; exit 0;;
	"-Volumeset") VolumeSet $@;;
	"-Positionget") echo $position; exit 0;;
	"-Positionset") PositionSet $@;;
	"-Addtrack") switch=0; AddTrack $@;;
	"-Addtrackswitch") switch=1; AddTrack $@;;
	#"-Deltrack") DelTrack $@;;
	"-Playlistlength") echo $playlistlength; exit 0;;
	"-Playlistnumber") echo $playlistnumber; exit 0;;
	
	"-Play") play=on; Play;;
	"-Pause") play=off; Play;;
	"-Stop") mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.Stop >/dev/null; exit 0;;
	"-Previous") mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.Prev >/dev/null; exit 0;;
	"-Prev") mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.Prev >/dev/null; exit 0;;
	"-Next") mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.Next >/dev/null; exit 0;;
	
	"-Loopon") mdbus2 org.mpris.vlc /TrackList org.freedesktop.MediaPlayer.SetLoop 1 >/dev/null; exit 0;;
	"-Loopoff") mdbus2 org.mpris.vlc /TrackList org.freedesktop.MediaPlayer.SetLoop 0 >/dev/null; exit 0;;
	"-Trackloopon") mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.Repeat 1 >/dev/null; exit 0;;
	"-Trackloopoff") mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.Repeat 0 >/dev/null; exit 0;;
	"-Randomon") mdbus2 org.mpris.vlc /TrackList org.freedesktop.MediaPlayer.SetRandom 1 >/dev/null; exit 0;;
	"-Randomoff") mdbus2 org.mpris.vlc /TrackList org.freedesktop.MediaPlayer.SetRandom 0 >/dev/null; exit 0;;
	
	"-Vlcversion") echo $vlcversion; exit 0;;
	"-Vlcclose") mdbus2 org.mpris.vlc / org.freedesktop.MediaPlayer.Quit >/dev/null; exit 0;;
	"-Help") HELP;;
	"-H") HELP;;
	*) echo "incorrect parameters"; exit 1;;
esac
}


Choice()
{
tracklist=0
# Test if vlc is running
if [ "$process" ]
	then
		if [ "$param" == "-Track" ]; then TrackList $@; exit 0; fi
		metadata="$(mdbus2 org.mpris.vlc /Player org.freedesktop.MediaPlayer.GetMetadata 2>/dev/null)"
		DBUS $@; Player $@		
	else
		###  Option --quiet / -q stellt Meldung ab
		if [ ! "$(echo "$@" | sed 's/^.* --quiet .*$//;s/^.* --quiet$//' 2>/dev/null)" ]; then exit 0; fi
		if [ ! "$(echo "$@" | sed 's/^.* -q .*$//;s/^.* -q$//' 2>/dev/null)" ]; then exit 0; fi
		case $param in
			# Setze Alternativbild, wenn VLC nicht laeuft
			"-Conkypicture") vlc=notrun; ConkyPicture $@ echo $cimgpath; exit 0;;
			"-Conkysetaltpic") Conkysetaltpic $@;;
			"-Conkysetnocovpic") Conkysetnocovpic $@;;
			"-Help") HELP;;
			"-H") HELP;;
			*) echo "VLC is not running"; exit 0;;
		esac
fi
}


# leicht abweichende Parameter erlauben (-File; --File; -file; --file; --FiLE) ==> (-File)
param="$(echo "$1" | sed 's/^-\(-.*\)$/\1/;s/^-\(.\)\(.*\)$/-\u\1\L\2/')"


Choice $@

# exit 1 ist Standard
# wenn das Skript bis hierher laeuft, ist irgendetwas faul ==> Methode checken
#METHODCHECK
exit 1


########################
#####              #####
#####     TODO     #####
#####              #####
########################


###   Konfigurationsdatei des VLC-Players
### $HOME/.config/vlc/vlcrc


###   Fake-tty-method
### vlcrc:   rc-unix=/tmp/vlc.sock
### vlcrc:   rc-fake-tty=1
#
#unixsocket="/tmp/vlc.sock"
#if [ cat "$HOME/.config/vlc/vlcrc" | sed '/rc-unix/!d' ]; then echo yay; fi
#sed 's/^#*rc-unix=/rc-unix='"$(echo "$unixsocket" | sed '')"'/'
#


### DBUS-method
# control=.*dbus.*

#case $dbus in
# "mdbus2") ;;
# "qdbus") ;;
# "gdbus") ;;
# esac

Benutzeravatar
synapsenstau
Beiträge: 172
Registriert: 08.10.2013 09:56:34
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Südharz

Re: [gelöst] Verzeichnispfad mit Script "zerteilen" via sed?

Beitrag von synapsenstau » 03.03.2014 09:38:38

Danke für das Script.....werde ich mir bei gelegneheit mal anschauen..

Fürs erste hat mir "awk" zu auslesen der Statusmeldungen gereicht, weil diese von einem anderen Programm genutzt wird.
..::: Intel® Core™ i5-6600 :::..::: 16 GB Ram :::..
..::: 1 TB Nvme :::..::: 1 TB SSD :::..::: NVIDIA GeForce GTX 1070 :::.

Antworten