Ζητείται sedάς και awkάς (Βοήθεια για bash script)

Έχω ένα σκριπτάκι που δουλεύει ακόμη. Πήγαινε και διάβαζε αυτό

www.eortologio.gr/rss/si_el.xml

και ξεχώριζε (κάπου έχει μία awk που κάνει τη δουλειά) τα ονόματα που γιορτάζουν και μου τα έλεγε με το espeak καθώς τα έδειχνε σε popup με τη notify-send.
Εδώ και πολύ καιρό έχουν αλλάξει τα γιουαρέλ τους αυτοί και το σκριπτάκι μου
που έχει τη διέυθυνση που έβαλα πιο πάνω, μου απαντάει “Μεγάλη Τρίτη”. Το έχουν παρατήσει έτσι αυτό το γιουαρέλ.

Η καινούργια τους διεύθυνση μάλλον είναι αυτή https://www.giortes.gr/ και το σκριπτ μου είναι αυτό

#!/bin/bash
dir=`dirname $0`
if [ ${0:0:1} != "/" ]
then
	dir=$PWD/`dirname $0`
fi

#This is the xslt file that will be used to transform the rss feed into a text file
XSLT="$dir/giortazoun.xsl"

#get the RSS feed
/usr/bin/wget http://www.eortologio.gr/rss/si_el.xml -O /tmp/today.xml

#pass it through our XSLT
today="`/usr/bin/xsltproc $XSLT /tmp/today.xml | awk -F ":" '{print $2}' | sed -e 's/(πηγή//g' `"
notify-send -t 14000 "Γιορτάζουν σήμερα : " "$today" --icon=/home/family/eortologio/doro.jpg

espeak -v el -p 35 -s 100 -k 1 "Γιορτάζουν σήμερα,$today"

Μπορείτε να το διορθώσετε με βάση το πως είναι η σελίδα σήμερα;

Εδω ειναι η δικη μου εκδοση. Ριχτου μια ματια και δες αν σου δουλευει και σου κανει:

#!/bin/bash

#Get the XML File from the RSS feed
/usr/bin/wget https://www.giortes.gr/rss/si_el.xml -O /tmp/today.xml

#Find a distinct string attribute of the line that mentions the namedates celebrated today and grep it
#then parse it with the double colon as a delimiter and get rid of the trailing tag with sed
today=$(grep isPermaLink /tmp/today.xml | awk -F ":" '{print $2}' | sed -e 's/<\/guid>//g')

#pass the resulting string to notify-send and espeak as an added bonus
notify-send -t 14000 "Γιορτάζουν σήμερα : $today" --icon=/home/family/eortologio/doro.jpg
espeak -v el -p 35 -s 100 -k 1 “Γιορτάζουν σήμερα,$today”

Ελπιζω να βοηθησα

5 «Μου αρέσει»

H δική μου έκδοση. Αντί για την εντολή xmlint μπορεί να χρησιμοποιηθεί οποιοδήποτε άλλο εργαλείο καταλαβαίνει XPath. Η αρχική έκδοση κάνει χρήση του XSLT που πιθανά να έχει καλύτερη διαδρομή για XPath μέσα, αλλά δεν έχουμε αυτό το αρχείο, ούτε τα υπόλοιπα. Αλλά νομίζω έτσι είναι πολύ πιο καθαρό, μιας και για κάποιο λόγο (υποθέτω είτε αρχαιότητα, είτε επιφανειακή γνώση) δεν κάνει πλήρη χρήση του XSLT και αναγκάζετε να χρησιμοποιήσει το awk.

#!/bin/bash

icon="/home/family/eortologio/doro.jpg"
title="Γιορτάζουν σήμερα"

url="https://www.giortes.gr/rss/si_el.xml"
xpath="substring-after(//channel/item/title/text(),':')"

today=$(curl -s ${url} | xmllint --xpath "${xpath}" - )

notify-send "${title}" "${today}" --icon="${icon}"

Κάτι λέει στο web site για αλλαγή στο URL, αλλά δεν κατάφερα να βρω κάτι πιο καθαρό ή με καλύτερο XML. Αν βρεθεί κάτι καλύτερο ή αν η δομή αλλάξει, το έφτιαξα έτσι ώστε να είναι ορατό που θα γίνουν οι αλλαγές.

Κάποια σχόλια για καμένους

ΥΓ: Αν έχεις να κάνεις με κείμενα που έχουν μέσα αναδρομικές δομές, όπως η XML/HTML, τότε τα εργαλεία που βασίζονται σε κανονικές εκφράσεις, όπως τα sed, awk, grep είναι ακατάλληλα. Θα μπορούσα να το χόντραινα λέγοντας για ιεραρχίες γλωσσών Chomsky, αλλά damn μόλις το έκανα :innocent:.

Ας κρατήσουμε πως αν έχουμε XML ένα καλό εργαλείο είναι το XPath και αν έχουμε κάτι σε json τότε χρησιμοποιούμε το jq. Πάνω στη δεύτερη περίπτωση υπάρχουν αρκετές προσπάθειες ώστε να γίνει το πρότυπο για τις σωληνώσεις στο Linux.

5 «Μου αρέσει»

Για να μην ψάχνεται και άλλος συμπληρώνω οτι θέλει την libxml2-utils για να λειτουργήσει σε debian…

Ενα αλλο εργαλειο ειναι το χq που μπορουμε να χρησιμοποιησουμε για να μετατρεψουμε XML σε JSON και μετα απο κει να παρουμε αυτα που θελουμε με το jq. Δεν ξερω αν το xq χρειαζεται το libxml2-utils που ανεφερε πιο πανω ο φιλτατος @raik αλλα με αυτα τα δυο βασικα εργαλεια εκανα την δευτερη εκδοση μου:

#!/bin/bash

#Dependencies: wget
#              xq (Converts XML to JSON. Install with: sudo pip install yq)
#              jq (runs JSON queries. Install with: sudo apt install jq)
#              sed 
#              awk
#              notify-send
#              espeak


#Get the XML File from the RSS feed
wget https://www.giortes.gr/rss/si_el.xml -O /tmp/today.xml 

#Pipe the contents of /tmp/today.xml into xq and convert them to JSON format
#then pipe them to jq and extract the value of the title element. Erase the 
#special characters " and ►► then parse it with the double colon as a delimiter
today=$(cat /tmp/today.xml | xq . | jq '.rss.channel.item.title' | sed -e 's/►►//g' | awk -F ":" '{print $2}' | sed -e 's/\"//g' )

#pass the resulting string to notify-send and espeak as an added bonus
notify-send -t 14000 "Γιορτάζουν σήμερα:" "$today" --icon=/home/family/eortologio/doro.jpg

espeak -v el -p 35 -s 100 -k 1 “Γιορτάζουν σήμερα,$today”

Και παλι ελπιζω να βοηθησα. Εχει ενδιαφερων πως μπορει καποιος να μετατρεψει δεδομενα απο το ενα format στο αλλο (XML σε JSON ή και το αντιθετο) για να διαβασει σε scripts δεδομενα που αλλιως θα θελανε ολοκληρα προγραμματα για να διαβαστουν.

4 «Μου αρέσει»

Δες και αυτό

simera=$(wget -q -O- http://www.greeknamedays.gr/tools/eortologiorssfeed/index.php\?langid\=gr | grep -o "<description>.*" | tail -n1  | cut -c 14- | cut -f1 -d"<" | sed 's/\, /\n/g')
notify-send -t 30000 "$simera"
7 «Μου αρέσει»

Ωραίος! Έκανα μια τροποποίηση του παραπάνω αντικαθιστώντας το εικονίδιο με ένα πιο γενικό, να τρέχουν ειδοποίηση και εκφώνηση παράλληλα και τέλος μορφοποίηση της ειδοποίησης με επικεφαλίδα και κυρίως κείμενο.

giortsim=$(wget -q -O- http://www.greeknamedays.gr/tools/eortologiorssfeed/index.php\?langid\=gr | grep -o "<description>.*" | tail -n1  | cut -c 14- | cut -f1 -d"<" | sed 's/\, /\n/g'); notify-send "Γιορτάζουν σήμερα" "$giortsim" -t 30000 -i view-calendar-birthday; espeak -v el -p 35 -s 100 -k 1 "Γιορτάζουν σήμερα, $giortsim"
3 «Μου αρέσει»

Είστε σεντάδες και οκάδες. Τι να κάνουμε!

Σας ευχαριστώ όλους.

Πατώντας στα script όλων των παραπάνω έγραψα μια νέα εκδοχή όπου κοιτάζει και τις επόμενες δύο μέρες (εκτός τη σημερινή) και επιστρέφει όποια μέρα έχει συντομότερα γιορτή.

Επίσης αντί για το μακρινάρι με όλες τις μικροπαραλλαγές των ονομάτων επιστρέφει μόνο τα κύρια ονόματα και η διάρκεια της ειδοποίησης τώρα είναι ανάλογη με το μήκος του κειμένου.
Αν δεν θέλουμε την εκφώνηση ακυρώνουμε την τελευταία γραμμή.

Update Πρόσθεσα σιωπηλή σημείωση για τις μέρες που προσπερνώνται όπου δεν βρέθηκαν γιορτές.

#!/bin/bash

url=https://www.greeknamedays.gr/tools/eortologiorssfeed/index.php?langid=gr\&daydisplay=3
xpath1="substring-after(//channel/item[1]/title/text(),': ')"
xpath2="substring-after(//channel/item[2]/title/text(),': ')"
xpath3="substring-after(//channel/item[3]/title/text(),': ')"

simera=$(curl -s ${url} | xmllint --xpath "${xpath1}" - | sed 's/\, /\n/g')
 aurio=$(curl -s ${url} | xmllint --xpath "${xpath2}" - | sed 's/\, /\n/g')
maurio=$(curl -s ${url} | xmllint --xpath "${xpath3}" - | sed 's/\, /\n/g')

keni="Δεν βρέθηκαν γιορτές"

if [[ "$simera" != "$keni" ]]; then
	titlos="Γιορτάζουν σήμερα"
	giortazoun="$simera"
	aneu=""
else
	titlos="–"
	aneu="$keni για σήμερα"
	if [[ "$aurio" != "$keni" ]]; then
		titlos="Γιορτάζουν αύριο"
		giortazoun="$aurio"
	else
		titlos="–"
		aneu="$keni για σήμερα ή αύριο"
		if [[ "$maurio" != "$keni" ]]; then
			titlos="Γιορτάζουν μεθαύριο"
			giortazoun="$maurio"
		else
			titlos="–"
			giortazoun=""
			aneu="$keni για σήμερα, αύριο ή μεθαύριο"
		fi
	fi
fi

if [[ -z "$giortazoun" ]]; then
	diarkeia=$(((${#aneu})*133-1000))
	swma="<i>${aneu@E}</i>"
elif [[ -z "$aneu" ]]; then
	diarkeia=$(((${#giortazoun})*233+1000))
	swma="${giortazoun@E}"
else
	diarkeia=$(((${#giortazoun})*233+1000))
	swma="${giortazoun@E}\n\n<i>${aneu@E}</i>"
fi

eikonidio="view-calendar-birthday"
notify-send "${titlos}" "${swma}" -i "${eikonidio}" -t "${diarkeia}"
espeak -v el -p 35 -s 100 -k 1 "${titlos}, ${giortazoun@E}"
4 «Μου αρέσει»