bash script για εύρεση λέξης - Solved με Perl τελικά  Το θέμα επιλύθηκε

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: bash script για εύρεση λέξης

Δημοσίευσηαπό SAMSONIC » 25 Φεβ 2013, 00:52

wow thanks. λοιπόν πως έχει η ιστορία. Είναι μια σελίδα που πάνω πάνω έχει κάποιες επικεφαλίδες και μετά ακολουθεί ένας πίνακας με στοιχεία. Δεν ξέρουμε πως παράγονται τα στοιχεία στον πίνακα αλλά μπορούμε να τον δούμε και μπορούμε να δούμε τον source της σελίδας.

π.χ.

Α/Α | Στοιχείο 1 | Στοιχείο 2 |
0___|___τάδε___|___1 / 2
1___|___τάδε___|___2 / 3
2___|___τάδε___|___4 / 2
3___|___τάδε___|___3 / 2
4___|___τάδε___|___1 / 5

(τα ___ τα έβαλα για να φαίνεται καλύτερα σαν πίνακας)

εγώ θέλω στο script μου ο χρήστης να δίνει τον Α/Α π.χ. 1 και να του βγαίνει το 2 / 3. Να δίνει το 4 και να του εμφανίζει το 1 / 5.
Ο τρόπος που σκέφτηκα ήταν να αποθηκεύει τον source της σελίδας και να βρίσκει π.χ. το 4 (αν αυτό έχει δώσει ο χρήστης) όταν το βρει μετά να συνεχίζει να διαβάζει το αρχείο μέχρι να φτάσει στο pattern (αριθμός / αριθμός) και μόλις το βρει να το εμφανίζει (άρα το 1 / 5).

Σίγουρα υπάρχουν πολλές λύσεις όπως π.χ. θα μπορούσα να διαβάζω με κάποιον τρόπο τον πίνακα ως έχει και να τον αποθηκεύω σε ένα αρχείο και να εκτυπώνεται κατά γραμμές απευθείας το αποτέλεσμα. Απλά μου έξαψε την περιέργεια ο παραπάνω τρόπος.
Γνώσεις => Linux: Χμμμ κάτι κάνω... ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Πολύ καλό
Λειτουργικό => Ubuntu 12.04 precise 3.2.0-38-generic-pae 32bit (el_GR.UTF-8, Unity ubuntu) ‖ Windows 7
Χαρακτηριστικά => Intel Core2 Duo CPU T5550 1.83GHz ‖ RAM 2004 MiB ‖ Quanta 30CC - HP Pavilion dv6700 Notebook PC
Κάρτα γραφικών => Intel Mobile GM965/GL960
Κάρτες δικτύων => Ethernet: Realtek RTL8101E/RTL8102E ‖ Wireless: Intel PRO/Wireless 3945ABG
SAMSONIC
babeTUX
babeTUX
 
Δημοσιεύσεις: 11
Εγγραφή: 12 Φεβ 2012, 23:08
Εκτύπωση

Re: bash script για εύρεση λέξης  Το θέμα επιλύθηκε

Δημοσίευσηαπό evolgen » 25 Φεβ 2013, 01:15

Ορίστε:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#!/usr/bin/env perl

use strict;
use warnings;

use Encode; # Perl module από το cpan.org
use utf8;

@ARGV == 2 or die "Usage: $0 input_file word\n"; # θέλουμε 2 arguments ακριβώς

my $input_file = $ARGV[0]; # το όνομα του αρχείου με το κείμενο

local $/ = undef; # δίνει εντολή να διαβάζει περιεχόμενα από την αρχή ως το τέλος, χωρίς διακοπή σε κάποιο χαρακτήρα

open my $fh, '<', $input_file or die $!; # άνοιξε το αρχείο και διάβασε τα περιεχόμενά του
my $text = <$fh>;
close $fh;

$text = decode 'UTF8', $text; # αν κανένας χαρακτήρας είναι utf-8
my $word = $ARGV[1]; # επιλογή λέξης

binmode STDOUT, ':encoding(UTF-8)'; #τύπωσε ως utf-8, αν και μάλλον δεν χρειάζεται εδώ
while ( $text =~ /$word/ )
{
if (
$text =~ /$word # λέξη
.*? # οτιδήποτε άλλο ανάμεσα (non-greedy)
\s(\d+\s\/\s\d+)\s
/xs
)
{
print $1 . "\n";
$text = $';
}
else
{
last; # βγες από το loop αν δεν ισχύει το regex παραπάνω
}
}


Θεώρησα ότι πριν και μετά τα 1 / 2, 2 / 3 κλπ υπάρχει ένα κενό. Αν όχι, πες μου να το αλλάξω.

Μπορείς με την Perl να σώσεις το source μιας σελίδας σε μεταβλητή, χωρίς να χρειάζεται να το αποθηκεύσεις σε αρχείο. Αν θες, το μετατρέπω και έτσι.
Το να μειώνεις ένα έργο ελεύθερου λογισμικού, επειδή θεωρείς το δικό σου καλύτερο,
είναι απαράδεκτη συμπεριφορά και δε συμβαδίζει με τις αρχές του ελεύθερου λογισμικού.

Γνώσεις Linux: Μέτριο++ ┃ Προγραμματισμός: Perl, R, Python, SQL, C, Common Lisp, BashΑγγλικά: Άριστα

1. Ubuntu 14.04 trusty
2. Intel Core i7-3520M CPU @ 2.90GHz ‖ RAM 7892 MiB
3. Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
4. eth0: Broadcom NetXtreme BCM57765 Gigabit Ethernet PCIe [14e4:16b4] (rev 10) ⋮ eth1: Broadcom BCM4331 802.11a/b/g/n [14e4:4331] (rev 02)
Άβαταρ μέλους
evolgen
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1031
Εγγραφή: 28 Ιούλ 2010, 14:22
Τοποθεσία: UK
IRC: bioevolgenec
Εκτύπωση

Re: bash script για εύρεση λέξης

Δημοσίευσηαπό SAMSONIC » 25 Φεβ 2013, 01:55

πω ρε συ είσαι απίστευτος....

δεν είχε κενά πριν και μετά. οπότε έβγαλα τα κοκκινισμένα \s(\d+\s\/\s\d+)\s και δούλεψε.

βλέπεις τι μου κάνεις τώρα? θα κάτσω να διαβάσω perl για να το εξελίξω! :?

χίλια ευχαριστώ και μπράβο σου για την ταχύτητα! :thumbup:
Γνώσεις => Linux: Χμμμ κάτι κάνω... ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Πολύ καλό
Λειτουργικό => Ubuntu 12.04 precise 3.2.0-38-generic-pae 32bit (el_GR.UTF-8, Unity ubuntu) ‖ Windows 7
Χαρακτηριστικά => Intel Core2 Duo CPU T5550 1.83GHz ‖ RAM 2004 MiB ‖ Quanta 30CC - HP Pavilion dv6700 Notebook PC
Κάρτα γραφικών => Intel Mobile GM965/GL960
Κάρτες δικτύων => Ethernet: Realtek RTL8101E/RTL8102E ‖ Wireless: Intel PRO/Wireless 3945ABG
SAMSONIC
babeTUX
babeTUX
 
Δημοσιεύσεις: 11
Εγγραφή: 12 Φεβ 2012, 23:08
Εκτύπωση

Re: bash script για εύρεση λέξης

Δημοσίευσηαπό evolgen » 25 Φεβ 2013, 01:58

Τίποτα! :) Δες εδώ για εκμάθηση Perl. Ό,τι απορίες έχεις, ρώτησε ελεύθερα.

Άλλαξε καλύτερα και τον τίτλο του θέματος, βγάζοντας τη λέξη bash ή κάτι παρόμοιο, για να αντιστοιχεί καλύτερα στη συζήτηση.

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

Γνώσεις Linux: Μέτριο++ ┃ Προγραμματισμός: Perl, R, Python, SQL, C, Common Lisp, BashΑγγλικά: Άριστα

1. Ubuntu 14.04 trusty
2. Intel Core i7-3520M CPU @ 2.90GHz ‖ RAM 7892 MiB
3. Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
4. eth0: Broadcom NetXtreme BCM57765 Gigabit Ethernet PCIe [14e4:16b4] (rev 10) ⋮ eth1: Broadcom BCM4331 802.11a/b/g/n [14e4:4331] (rev 02)
Άβαταρ μέλους
evolgen
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1031
Εγγραφή: 28 Ιούλ 2010, 14:22
Τοποθεσία: UK
IRC: bioevolgenec
Εκτύπωση

Re: bash script για εύρεση λέξης - Solved με Perl τελικά

Δημοσίευσηαπό SAMSONIC » 25 Φεβ 2013, 02:06

done.

έχω χρόνια να ασχοληθώ με perl αλλά θυμάμαι την είχα πιάσει εύκολα. ευχαριστώ και πάλι :)
Γνώσεις => Linux: Χμμμ κάτι κάνω... ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Πολύ καλό
Λειτουργικό => Ubuntu 12.04 precise 3.2.0-38-generic-pae 32bit (el_GR.UTF-8, Unity ubuntu) ‖ Windows 7
Χαρακτηριστικά => Intel Core2 Duo CPU T5550 1.83GHz ‖ RAM 2004 MiB ‖ Quanta 30CC - HP Pavilion dv6700 Notebook PC
Κάρτα γραφικών => Intel Mobile GM965/GL960
Κάρτες δικτύων => Ethernet: Realtek RTL8101E/RTL8102E ‖ Wireless: Intel PRO/Wireless 3945ABG
SAMSONIC
babeTUX
babeTUX
 
Δημοσιεύσεις: 11
Εγγραφή: 12 Φεβ 2012, 23:08
Εκτύπωση

Προηγούμενη

  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι