Acrobase  

Καλώς ήρθατε στην AcroBase.
Δείτε εδώ τα πιο πρόσφατα μηνύματα από όλες τις περιοχές συζητήσεων, καθώς και όλες τις υπηρεσίες της AcroBase.
H εγγραφή σας είναι γρήγορη και εύκολη.

Επιστροφή   Acrobase > Υπολογιστές και Τεχνολογία > Πληροφορική και Επικοινωνία > Linux
Ομάδες (Groups) Τοίχος Άρθρα acrobase.org Ημερολόγιο Φωτογραφίες Στατιστικά

Notices

Δεν έχετε δημιουργήσει όνομα χρήστη στην Acrobase.
Μπορείτε να το δημιουργήσετε εδώ

Απάντηση στο θέμα
 
Εργαλεία Θεμάτων Τρόποι εμφάνισης
  #1  
Παλιά 03-10-10, 22:22
Το avatar του χρήστη Gildor
Gildor Ο χρήστης Gildor δεν είναι συνδεδεμένος
High Elf
 

Τελευταία φορά Online: 08-05-17 14:17
Φύλο: Δεν έχω αποφασίσει ακόμα
Η διαθεσή μου τώρα:
Αλλη μια ερωτηση για το bash

Υπαρχει καποια εντολή ή φίλτρο το οποίο απομονώνει ενα αριθμο (και δεκαδικο) απο ενα string?

Για παραδειγμα στο cp --version με επιστροφή "cp (GNU coreutils) 7.4" να μπορεσει να κραταει μονο το "7.4"
__________________
Υπάρχουν σε όλα δύο απόψεις...
Αυτή που λέω εγώ, και η σωστή!
Απάντηση με παράθεση
  #2  
Παλιά 04-10-10, 01:48
Το avatar του χρήστη Morgul
Morgul Ο χρήστης Morgul δεν είναι συνδεδεμένος
Άσωτος διαχειριστής
 

Τελευταία φορά Online: 08-01-20 22:07
Φύλο: Δεν έχω αποφασίσει ακόμα
Αρχική Δημοσίευση από Gildor Εμφάνιση μηνυμάτων
Υπαρχει καποια εντολή ή φίλτρο το οποίο απομονώνει ενα αριθμο (και δεκαδικο) απο ενα string?

Για παραδειγμα στο cp --version με επιστροφή "cp (GNU coreutils) 7.4" να μπορεσει να κραταει μονο το "7.4"
Υπάρχουν αρκετοί τρόποι να το κάνεις αυτό. Δεν ξέρω κάποιον που γίνεται σε αμιγές bash, αλλά αν αναφέρεσαι γενικά σε shell και σχετικές εντολές:

Κώδικας:
echo 'cp (GNU coreutils) 7.4' |
sed -e 's/^[^0-9.+-]\+//' -e 's/[^0-9.+-]\+$//'
Αυτό δουλεύει μια χαρά για έναν αριθμό ανά γραμμή. Δε δουλεύει καλά για πολλαπλούς αριθμούς ανά γραμμή, αλλά μπορείς να το προσαρμόσεις.

Αν επιτρέπονται οι pythonικές ατασθαλίες, να μια συνταγή που δουλεύει για όσους αριθμούς θες (απλά διαγράφει ό,τι δεν είναι αριθμός και σου σερβίρει όλους τους αριθμούς του αρχείου που του δίνεις σε μία γραμμή, χωρισμένους με κενά.

Κώδικας:
echo 'cp (GNU coreutils) 7.4' |
python -c 'import sys, re; print " ".join(re.findall("[0-9+.-]+",sys.stdin.read()))'
__________________
www.bedroomlan.org
Απάντηση με παράθεση
  #3  
Παλιά 04-10-10, 12:31
alan Ο χρήστης alan δεν είναι συνδεδεμένος
Μέλος
 

Τελευταία φορά Online: 01-09-18 23:09
Η διαθεσή μου τώρα:
Εκτός απ'ό,τι έγραψε ο Αλέξης σε sed, θα μπορούσες να χρησιμοποιήσεις και regexp σε perl.
Πιο απλά αν ξέρεις εκ των προτέρων σε ποια θέση της γραμμής είναι ο αριθμός που θέλεις, θα μπορούσες να χρησιμοποιήσεις awk ή cut

πχ
Κώδικας:
echo "version something 7.4" | awk '{print $3}'
όπου το delimeted field είναι space,και $3 είναι το 3ο field ή

Κώδικας:
echo "version something 7.4" | cut -d " " -f 3
Απάντηση με παράθεση
  #4  
Παλιά 04-10-10, 12:49
Qluser Ο χρήστης Qluser δεν είναι συνδεδεμένος
Μέλος
 

Τελευταία φορά Online: 30-12-18 15:18
Αρχική Δημοσίευση από Gildor Εμφάνιση μηνυμάτων
Υπαρχει καποια εντολή ή φίλτρο το οποίο απομονώνει ενα αριθμο (και δεκαδικο) απο ενα string?

Για παραδειγμα στο cp --version με επιστροφή "cp (GNU coreutils) 7.4" να μπορεσει να κραταει μονο το "7.4"
Αφού είπες bash, αν δεν σε νοιάζει ιδιαίτερα η φορητότητα του κώδικα σε αλλα shells:

Κώδικας:
#!/bin/bash
shopt -s extglob
string="cp (GNU coreutils) 7.4 some other junk"
ver=${string##*([^0-9.])}
ver=${ver%%*([^0-9.])}
Διαφορετικά μάλλον χρειάζεται εξωτερική επεξεργασία με sed κλπ.
Απάντηση με παράθεση
  #5  
Παλιά 06-10-10, 10:35
Το avatar του χρήστη Morgul
Morgul Ο χρήστης Morgul δεν είναι συνδεδεμένος
Άσωτος διαχειριστής
 

Τελευταία φορά Online: 08-01-20 22:07
Φύλο: Δεν έχω αποφασίσει ακόμα
Αρχική Δημοσίευση από Qluser Εμφάνιση μηνυμάτων
Αφού είπες bash, αν δεν σε νοιάζει ιδιαίτερα η φορητότητα του κώδικα σε αλλα shells[...]
Όλα αυτά τα (σχετικά) νέα extensions του bash το κάνουν να μοιάζει όλο και περισσότερο με Befunge χωρίς το hack value.
__________________
www.bedroomlan.org
Απάντηση με παράθεση
  #6  
Παλιά 07-10-10, 14:27
alan Ο χρήστης alan δεν είναι συνδεδεμένος
Μέλος
 

Τελευταία φορά Online: 01-09-18 23:09
Η διαθεσή μου τώρα:
Αρχική Δημοσίευση από Morgul Εμφάνιση μηνυμάτων
Όλα αυτά τα (σχετικά) νέα extensions του bash το κάνουν να μοιάζει όλο και περισσότερο με Befunge χωρίς το hack value.
Είπα κι εγώ... δε θα έλεγε την απαγορευμένη λέξη; Πέρασε πολύς καιρός!!
Απάντηση με παράθεση
  #7  
Παλιά 07-10-10, 15:17
Qluser Ο χρήστης Qluser δεν είναι συνδεδεμένος
Μέλος
 

Τελευταία φορά Online: 30-12-18 15:18
Αρχική Δημοσίευση από Morgul Εμφάνιση μηνυμάτων
Όλα αυτά τα (σχετικά) νέα extensions του bash το κάνουν να μοιάζει όλο και περισσότερο με Befunge χωρίς το hack value.
Μεταξύ μας, η extglob σύνταξη προέρχεται από το ksh και έχει μερικές δεκαετίες στην καμπούρα της.
Απάντηση με παράθεση
  #8  
Παλιά 09-10-10, 13:18
Το avatar του χρήστη Morgul
Morgul Ο χρήστης Morgul δεν είναι συνδεδεμένος
Άσωτος διαχειριστής
 

Τελευταία φορά Online: 08-01-20 22:07
Φύλο: Δεν έχω αποφασίσει ακόμα
Αρχική Δημοσίευση από Qluser Εμφάνιση μηνυμάτων
Μεταξύ μας, η extglob σύνταξη προέρχεται από το ksh και έχει μερικές δεκαετίες στην καμπούρα της.
Υπήρχε και στο bash [12].0 ως ένα από τα μπασταρδέματα με το ksh; Ποτέ δεν απέκτησα εμπειρία σε ksh κι έτσι δε μπορώ να πω ότι έχω ιδέα.

Α ναι, κατάλαβα την παρανόηση (δυστυχώς αφού έγραψα ένα κατεβατό προσπαθώντας να καταλάβω γιατί το ${VAR##word} ήταν extglob). Εγώ μιλούσα για το όλο variable expansion ${VAR##word}, όχι για το pattern (που όντως είναι extglob κρίνοντας από το manual).

Οπότε ουσιαστικά δε χρησιμοποιείς regexp επειδή το πρόβλημα είναι αρκετά απλό για να λυθεί με extglob. Πλάκα πλάκα και με απλό glob θα μπορούσε να λυθεί.
__________________
www.bedroomlan.org
Απάντηση με παράθεση
  #9  
Παλιά 09-10-10, 16:50
Qluser Ο χρήστης Qluser δεν είναι συνδεδεμένος
Μέλος
 

Τελευταία φορά Online: 30-12-18 15:18
Αρχική Δημοσίευση από Morgul Εμφάνιση μηνυμάτων
Υπήρχε και στο bash [12].0 ως ένα από τα μπασταρδέματα με το ksh; Ποτέ δεν απέκτησα εμπειρία σε ksh κι έτσι δε μπορώ να πω ότι έχω ιδέα.

Α ναι, κατάλαβα την παρανόηση (δυστυχώς αφού έγραψα ένα κατεβατό προσπαθώντας να καταλάβω γιατί το ${VAR##word} ήταν extglob). Εγώ μιλούσα για το όλο variable expansion ${VAR##word}, όχι για το pattern (που όντως είναι extglob κρίνοντας από το manual).
Α, ναι, συγνώμη για το μπέρδεμα. Τα ${VAR##word} κλπ προέρχονται επίσης από το Korn shell, αλλά έχουν επίσης υιοθετηθεί επίσημα από το POSIX οπότε πλέον υποστηρίζονται και από διάφορα Bourne-οειδή όπως dash ή busybox ash.

Οπότε ουσιαστικά δε χρησιμοποιείς regexp επειδή το πρόβλημα είναι αρκετά απλό για να λυθεί με extglob.
Επίσης τα regular expressions είναι σχετικά πρόσφατο απόκτημα στο bash (v3.x αν δεν κάνω λάθος).

Πλάκα πλάκα και με απλό glob θα μπορούσε να λυθεί.
Χμ όντως αλλά χωρίς υποστήριξη για επανάληψη στο glob θα πρέπει να κάνεις loops με το χέρι. Σ'αυτό το σημείο συνήθως λέω δεν βαριέσαι και χρησιμοποιώ εξωτερική εντολή. Αν η ταχύτητα ήταν τόσο σημαντική δεν θα ξεκινούσα να το γράφω σε shell άλλωστε ;-)

Λ.
Απάντηση με παράθεση
Απάντηση στο θέμα


Συνδεδεμένοι χρήστες που διαβάζουν αυτό το θέμα: 1 (0 μέλη και 1 επισκέπτες)
 
Εργαλεία Θεμάτων
Τρόποι εμφάνισης

Δικαιώματα - Επιλογές
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is σε λειτουργία
Τα Smilies είναι σε λειτουργία
Ο κώδικας [IMG] είναι σε λειτουργία
Ο κώδικας HTML είναι σε λειτουργία

Που θέλετε να σας πάμε;


Όλες οι ώρες είναι GMT +3. Η ώρα τώρα είναι 02:30.



Forum engine powered by : vBulletin Version 3.8.2
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.