Προς το περιεχόμενο

[INFO] Η δύναμη της Κονσόλας


Manos-Sx

Προτεινόμενες αναρτήσεις

παιδιά πολύ καλή δουλειά έχετε κάνει μέχρι στιγμής.

 

προσπαθώ εδώ και μερικές μέρες να κάνω το εξής: έχοντας πρόβλημα με τους ελληνικούς υπότιτλους, μετά απο googlαρισμα ανακάλυψα την εντολή:

 

>
recode iso-8859-7..utf8 όνομα_υπότιτλου;

 

η οποία λειτουργεί μια χαρά ακόμα και σε περίπτωση που υπάρχουν κενά στο όνομα του αρχείου, με την προσθήκη των χαρακτήρων ' αριστερά και δεξιά του κάθε κενού.

 

το θέμα είναι οτι με το παρακάτω script που έγραψα σε bash, έχω πρόβλημα με τα κενά...

 

όσο και να το googlαρα, δεν έβγαλα άκρη, μόνο κάτι για μια παράμετρο( ; ) IFS=" " την οποία δε κατάφερα να την ενσωματώσω ποτέ σωστά στο script.

 

>
#!/bin/bash
# scrpit entolis gia recode ellininwn upotitlwn
cd Επιφάνεια" "εργασίας
pwd


echo "Hello, "$USER"!!!"
echo -n "onoma arxeiou: "
read name #| sed 's/[_ \t]\+/ /'
echo "telos."

recode iso-8859-7..utf8 "$name";

exit

 

όποια υπόδειξη χρήσιμη και σίγουρα πολύ πιο οφέλιμη απο έτοιμο και διαφορετικό κώδικα :)

 

ευχαριστώ εκ των προτέρων :-D

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 889
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Για τα κενά είτε θα πρέπει να τα βάλεις μέσα σε " ολόκληρο το όνομα του αρχείου ή του καταλόγου ή θα πρέπει πριν το κενό να προηγείται το σύμβολο \. Δηλαδή:

>
cd "Επιφάνεια εργασίας"

ή

>
cd Επιφάνεια\ εργασίας

H recode δεν έχει πρόβλημα με το κενό γιατί έχεις συμπεριλάβει ήδη το όνομα του αρχείου (μεταβλητή $name) μέσα σε " " (στη γραμμή που εκτελείται η recode)

Γιατί όμως δε χρησιμοποιείς την εντολή recode κατευθείαν και έφτιαξες αυτό το script; Εκτός αν είναι για να μη γράφεις κάθε φορά τα iso...., utf8

Επίσης φαντάζομαι θα ήταν ευκολότερο να περνάς το όνομα του αρχείου που θέλεις να μετατρέψεις με όρισμα κατά την εκτέλεση του script (command line argument). Δηλαδή:

>
convert_script greek subtitles.srt

Το όνομα του αρχείου greek subtitles.srt είναι αποθηκευμένο στη μεταβλητή $@. Οπότε το script σου θα μπορούσε να είναι έτσι::

>
#!/bin/bash
cd ~/Επιφάνεια\ Εργασίας
recode iso8859-7..utf8 $@

Επίσης εκτός από την recode υπάρχει και η iconv που κάνει το ίδιο πράγμα:

>
iconv -f ISO-8859-7 -t UTF8 <filename> -o <new_filename>

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στο ίδιο πνεύμα με αυτά που είπε ο capthookb, μπορείς να δώσεις

 

alias recode_greek='recode iso8859-7..utf8'

 

οπότε στη συνέχεια για μετατροπές μπορείς να δίνεις

recode_greek movie.srt

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

 

edit:

 

επίσης φίλε μου alkisg αυτό με το alias πάλι δεν δουλεύει για filename με κενά και δεν είναι μόνιμο :-(

νομίζω πως κάτι παίζει με κάποιο συγκεκριμένο αρχείο και τις μεταβλητές περιβάλλοντος (στα win έτσι λέγεται, στο linux νομίζω πως έχει άλλη ονομασία), προκειμένου να γίνει μόνιμο.

 

μάλλον δεν ήμουν σαφής. θέλω μια καθοδήγηση στο πως θα διαχειριστώ τα κενά όταν το script ζητάει το όνομα του αρχείου, δλδ το concept είναι: <<όπου βλέπεις τον χαρακτήρα του κενού εσύ βάλε " " >> και μετά το τελικό string να πηγαίνει στο τέλος σαν όρισμα στο recode.

 

ευχαριστώ ούτως ή άλλως :-D

 

ps: φίλε μου capthookb πιστέυω οτι το bash και γενικότερα η φιλοσοφία πίσω απο τα σενάρια είναι ο αυτοματισμός, με απώτερο σκοπό την διευκόλυνση τετριμένων ρουτινών στο σύστημα και κατ'επέκταση στη ζωή μας :) linuξάρα ftw!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πολλές ερωτήσεις μαζί:

1. Για τα aliases, δηλώνονται είτε στο (system wide) /etc/profile είτε για κάθε χρήστη ξεχωριστά (που είναι και το καλύτερο) .bashrc. Για άλλα shells υπάρχουν αντίστοιχα αρχεία που δηλώνονται τα aliases. Σε κάποια shells δε, δεν λέγονται aliases και η εντολή δέν είναι alias αλλά setenv.

 

2. Στο bash μπορείς να χρησιμοποιήσεις τα double quotes που με εξαίρεση τα σύμβολα & (αναφορά σε μεταβλητή στο bash), ` (ότι περικλείεται σε τέτοια εκτελείται αυτόματα από το shell) και \ (escape character), τα υπόλοιπα, μαζί και το white space, διαβάζονται κανονικά από το shell.

Πειραματίσου με αυτό

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πολλές ερωτήσεις μαζί:

1. Για τα aliases, δηλώνονται είτε στο (system wide) /etc/profile είτε για κάθε χρήστη ξεχωριστά (που είναι και το καλύτερο) .bashrc. Για άλλα shells υπάρχουν αντίστοιχα αρχεία που δηλώνονται τα aliases. Σε κάποια shells δε, δεν λέγονται aliases και η εντολή δέν είναι alias αλλά setenv.

 

2. Στο bash μπορείς να χρησιμοποιήσεις τα double quotes που με εξαίρεση τα σύμβολα & (αναφορά σε μεταβλητή στο bash), ` (ότι περικλείεται σε τέτοια εκτελείται αυτόματα από το shell) και \ (escape character), τα υπόλοιπα, μαζί και το white space, διαβάζονται κανονικά από το shell.

Πειραματίσου με αυτό

 

φίλε μου δοκίμασα να γράψω στο terminal, εκεί που μου ζητάει το όνομα του αρχείου, το όνομά του μέσα σε διπλά εισαγωγικά "filename με κενά δλδ", αλλά τπτ...

 

ακόμη πιστεύω οτι πρέπει να γίνει πρώτα επεξεργασία του εισαγώμενου αλφαριθμητικού, ή με κάποιον τρόπο να ορίσω κάπου οτι κατα την εισαγωγή στο promt όσα arguments λάβει σαν εισαγωγή (δλδ κάθε λέξη θεωρείται argument, αφού τις διαχωρίζει κενό), πρέπει να ενωθούν μεταξύ τους σε ενα κοινό αλφαριθμητικό και το τελικό να πάει σαν argument εντός εισαγωγικών στο τέλος της recode...

 

αν δεν υπάρχει κάποια προφανής λύση εδώ, σκέφτηκα να κάνω ενα script σε python το οποίο να αναλάβει την διαχείρηση και την επεξεργασία της εισαγωγής του ονόματος και μετά το τελικό string να το εισάγει σαν argument στο recode, αλλά δεν ξέρω κατα πόσο εφικτό είναι να ανοίξει ενα script το terminal...

 

ευχαριστώ για τις μέχρι τωρα απαντήσεις.

 

btw εσείς τι κάναντε στο linux σας για τους ελληνικούς υπότιτλούς;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

φίλε μου το δοκίμασα αλλά τπτ, τους αναγνωρίζει μεν αλλά γράφει αλαμπουρνέζικα.

 

edit:

 

αν δεν το κανω recode τον υπότιτλο και τον εισάγω όπως είναι παίζει μια χαρά thnks! :)

 

 

 

τραγικά άσχετο, αλλά μια και μιλάμε για το vlc και για να μην ανοίγω ακόμα ενα περιττό για τον server του insomnia thread (σλούρπ! :-p ), να ρωτήσω αν έχει αντιμετωπίσει κανείς το πρόβλημα σε ορισμένα βίντεο όταν πατάτε παύση, το βίντεο να συνεχίζει να παίζει κανονικά και οι υπότιτλοι να επιστρώνονται ο ενας πάνο στον άλλο (αν ξαναπατήσω play διορθώνεται η κατάσταση). αν έχει να προτείνει κανείς καμιά λύση και για αυτό θα του ήμουν υπόχρεος :o

 

 

 

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Διάβασε λίγο προσεκτικά το παρακάτω παράδειγμα.

Οι γραμμές που ξεκινάνε με # είναι σχόλια.

Το "��������� ��� ������" δεν είναι πρόβλημα του φόρουμ, επίτηδες χρησιμοποιείται λάθος κωδικοποίηση και δεν πρέπει να φαίνεται σωστά.

 

>
$ # Ας φτιάξουμε ένα .srt αρχείο σαν αυτά που κατεβάζουμε από το Internet:
$ echo "Υπότιτλοι στα ελληνικά" | iconv -f UTF-8 -t CP1253 > "Αρχείο με κενά στο όνομα.srt"
$ # Ας δούμε τι περιέχει:
$ cat "Αρχείο με κενά στο όνομα.srt"
��������� ��� ������
$ # Προφανώς και δεν το είδαμε σωστά, αφού περιέχει ελληνικά με κωδικοποίηση CP1253.
$ # Ας φτιάξουμε ένα alias για τη σωστή προβολή τέτοιων αρχείων:
$ alias cat1253='iconv -f CP1253 -t UTF-8'
$ # Ας δούμε τώρα το αρχείο με τη νέα αυτή εντολή που φτιάξαμε:
$ cat1253 "Αρχείο με κενά στο όνομα.srt" 
Υπότιτλοι στα ελληνικά

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

alkisg καταρχάς σε ευχαριστώ που ασχολείσαι ακόμα :)

 

κατάλαβα τι κάνει, απλά το θέμα είναι να μη γίνεται η εισαγωγή του ονόματος απο τον χρήστη με τα εισαγωγικά, δλδ ενα copy paste αυτού που θέλει (το copy του filename πορεί να γίνει με F2 και Ctrl+C στο αρχείο) κατευθείαν στο prompt χωρίς τα εισαγωγικά.

 

μέχρι στιγμής πιστεύω οτι το πρόβλημα είναι καθαρά με το prompt και το πως αντιμετωπίζει τα αλφαριθμητικά το terminal ανάμεσα στα κενά, πιστεύω οτι μια πιθανή κατεύθυνση θα είναι αν αντιμετωπιστούν όλες οι λέξεις σαν arguments και ενοποιηθούν σε ενα τελικό string όπως ανέφερα και πιο πάνω.

 

οποιαδήποτε άλλη ιδέα ευπρόσδεκτη :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Χωρίς να έχω διαβάσει όλο το thread, κατάλαβα ότι υπάρχει πρόβλημα με τα κενά στα ονόματα. Μια λύση που είχα βρει είναι η προσθήκη της γραμμής

>export IFS=$' \t\n'

στο script. Μετά από αυτό, το script δεν θα χωρίζει τα ονόματα σε ξεχωριστά arguments σύμφωνα με τα κενά τους. Με λίγο ψάξιμο για αυτή την εντολή θα βρεις παραδείγματα για την χρήση της.

(Δεν ξέρω άμα έχει αναφερθεί πάλι αυτό. Αμα έχει αναφερθεί αγνοήστε το post)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

alkisg καταρχάς σε ευχαριστώ που ασχολείσαι ακόμα :)

 

κατάλαβα τι κάνει, απλά το θέμα είναι να μη γίνεται η εισαγωγή του ονόματος απο τον χρήστη με τα εισαγωγικά, δλδ ενα copy paste αυτού που θέλει (το copy του filename πορεί να γίνει με F2 και Ctrl+C στο αρχείο) κατευθείαν στο prompt χωρίς τα εισαγωγικά.

 

μέχρι στιγμής πιστεύω οτι το πρόβλημα είναι καθαρά με το prompt και το πως αντιμετωπίζει τα αλφαριθμητικά το terminal ανάμεσα στα κενά, πιστεύω οτι μια πιθανή κατεύθυνση θα είναι αν αντιμετωπιστούν όλες οι λέξεις σαν arguments και ενοποιηθούν σε ενα τελικό string όπως ανέφερα και πιο πάνω.

 

οποιαδήποτε άλλη ιδέα ευπρόσδεκτη :)

Πνίγεσαι σε μια κουταλιά νερό. Προσπαθείς να χρησιμοποιήσεις gui+τερματικό μαζί και κάνεις τη ζωή σου δύσκολη. Δε χρειάζεται να πας να κάνεις copy το filename του αρχείου. Αν πας στο directory που υπάρχει το αρχείο που θες από το τερματικό με cd, και πατήσεις 1 ή 2 ή 3 αρχικά γράμματα του ονόματος του αρχείου, και στη συνέχεια το TAB θα "πληκτρολογηθεί" αυτόματα το όνομα του αρχείου με το \ (escape character) πριν τα κενά. Δηλαδή,

έστω πως στο /home/lomar/subs/ υπάρχει ένα αρχείο υποτίτλων exo dyo kena.srt.

 

>
cd ~/subs
cat1253 ei[TAB] και γίνεται cat exo\ dio\ kena.srt

όπου cat1253 είναι το alias που έφτιαξε ο alkisg παραπάνω ή μπορεί να είναι οποιοδήποτε άλλο εκτελέσιμο αρχείο ή δικό σου script. Λες δηλαδή στο cat1253 να επεξεργαστεί το αρχείο με τα κενά χωρίς όμως να αναγκαστείς να βάλεις "" στην αρχή και στο τέλος, απλά πατώντας το πρώτο γράμμα του ονόματος και το ΤΑΒ.

 

Επίσης όπως σου είχα πει και στην πρώτη μου απάντηση, μπορείς να χρησιμοποιήσεις τη μεταβλητή $@ σε ένα bash script για να κάνεις αυτό που λες (την ένωση των αλφαριθμητικών). Τρέξε το παρακάτω script για να καταλάβεις τι εννοώ:

 

Αρχικά φτιάξε ένα αρχείο με κενά στο όνομά του:

>
cd /home/lomar/subs
touch "exo dio kena.srt"

Μετά φτιάξε ένα script το οποίο θα το τρέχεις με όρισμα το filename exo dio kena.srt χωρίς εισαγωγικά "" ή \ πριν τα κενά

>
#!/bin/bash
echo "my name is $0"
echo "first argument is: $1"
echo "second argument is: $2"
echo "third argument is: $3"
echo "all arguments together: $@"

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πνίγεσαι σε μια κουταλιά νερό. Προσπαθείς να χρησιμοποιήσεις gui+τερματικό μαζί και κάνεις τη ζωή σου δύσκολη. Δε χρειάζεται να πας να κάνεις copy το filename του αρχείου. Αν πας στο directory που υπάρχει το αρχείο που θες από το τερματικό με cd, και πατήσεις 1 ή 2 ή 3 αρχικά γράμματα του ονόματος του αρχείου, και στη συνέχεια το TAB θα "πληκτρολογηθεί" αυτόματα το όνομα του αρχείου με το \ (escape character) πριν τα κενά. Δηλαδή,

έστω πως στο /home/lomar/subs/ υπάρχει ένα αρχείο υποτίτλων exo dyo kena.srt.

 

>
cd ~/subs
cat1253 ei[TAB] και γίνεται cat exo\ dio\ kena.srt

όπου cat1253 είναι το alias που έφτιαξε ο alkisg παραπάνω ή μπορεί να είναι οποιοδήποτε άλλο εκτελέσιμο αρχείο ή δικό σου script. Λες δηλαδή στο cat1253 να επεξεργαστεί το αρχείο με τα κενά χωρίς όμως να αναγκαστείς να βάλεις "" στην αρχή και στο τέλος, απλά πατώντας το πρώτο γράμμα του ονόματος και το ΤΑΒ.

 

Επίσης όπως σου είχα πει και στην πρώτη μου απάντηση, μπορείς να χρησιμοποιήσεις τη μεταβλητή $@ σε ένα bash script για να κάνεις αυτό που λες (την ένωση των αλφαριθμητικών). Τρέξε το παρακάτω script για να καταλάβεις τι εννοώ:

 

Αρχικά φτιάξε ένα αρχείο με κενά στο όνομά του:

>
cd /home/lomar/subs
touch "exo dio kena.srt"

Μετά φτιάξε ένα script το οποίο θα το τρέχεις με όρισμα το filename exo dio kena.srt χωρίς εισαγωγικά "" ή \ πριν τα κενά

>
#!/bin/bash
echo "my name is $0"
echo "first argument is: $1"
echo "second argument is: $2"
echo "third argument is: $3"
echo "all arguments together: $@"

 

φίλε μου νομίζω οτι αυτό που πρότεινα με το copy paste είναι λιγάκι γρηγορότερο... γούστα είναι αυτά όπως βολεύεται ο καθένας... τα υπόλοιπα θα τα κοιτάξω αργότερα, σε ευχαριστώ πάντως -ξανά- για το χρόνο σου :-)

 

 

@macabre_sunsets φίλος στο IFS είχα πέσει και εγώ πάνω, αλλά δεν είχε αποτέλεσμα, και έτσι δοκίμασα με διασωλήνωση στο read το: | sed 's/[_ \t]\+/ /' το οποίο επίσης απέτυχε :-(

 

edit: μόλις το δοκίμασα και πέτυχε! ακριβώς αυτό που ήθελα! σου χρωστάω μπύρες και σουβλάκια B)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

lomar μην αγνοεις το TAB που λέει ο capthookb, ειναι απο τα δυνατα εργαλεια του linux και απο τα πιο παραγωγικά !!

μπραβο σου και που ασχολεισαι με το bash, για μενα ειναι απαραιτητο για την χρηση του λειτουργικού γενικότερα

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

To $IFS μια χαρά δουλεύει.

Επίσης μπορεί να χρησιμοποιηθεί το $@ όπως λέει κι ο capthookb, για να μετατραπούν όλα τα ορίσματα σε ένα και να σου δουλέψει αυτό με το copy/paste που λανθασμένα προσπαθείς να κάνεις.

 

Αλλά δεν επεκτείνομαι γιατί μάλλον ψάχνεις για το παρακάτω:

 

(υποθέτω gnome)

Alt+F2

paste αυτό:

gedit ".gnome2/nautilus-scripts/Μετατροπή υποτίτλων από CP1253 σε UTF-8"

 

Ανοίγει το gedit με ένα άδειο αρχείο. Κάνεις paste αυτό:

iconv -f CP1253 -t UTF-8 "$1" -o "$1.utf8"

 

Αποθηκεύεις το αρχείο. Ανοίγεις τον nautilus. Κάνεις δεξί κλικ κάπου, και από το μενού διαλέγεις Σενάρια εντολών » Άνοιγμα φακέλου προγραμμάτων εντολών.

 

Εκεί θα δεις το αρχείο "Μετατροπή υποτίτλων από CP1253 σε UTF-8" που έφτιαξες παραπάνω. Του κάνεις δεξί κλικ, Ιδιότητες, Δικαιώματα, και τσεκάρεις [v] Να επιτρέπεται η εκτέλεση του αρχείου ως πρόγραμμα.

 

ΟΚ, τέλος. Να τι κατάφερες:

 

Πηγαίνοντας με τον nautilus κάπου, κάνεις δεξί κλικ σε ένα αρχείο υποτίτλων » Σενάρια » Μετατροπή υποτίτλων από CP1253 σε UTF-8

και αυτόματα δημιουργείται ένα νέο αρχείο στον ίδιο φάκελο με UTF-8 κωδικοποίηση.

 

 

Ουφ... τελικά θα ήταν 10 φορές πιο εύκολο να γράψω τις σχετικές εντολές σε κονσόλα για να κάνεις τα παραπάνω, θα είχα τελειώσει με 3 γραμμές οδηγίες μόνο!!! :D

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...