Newsgroup: it.comp.os.linux.iniziare
Titolo: sed cancellare le prime N righe che contengono un pattern

 
Nella fattispecie sto cercando di cancellare
le righe che contengono solamente un numero,
da una a tre cifre, preceduto o seguito da
eventuali caratteri "spazio" o "tabs".
 
Il pattern sarebbe il seguente:
 
^\( |\t\)*[0-9]\{1,3\}\( |\t\)*$
 
Ora, nel titolo ho scritto che vorrei rimuovere
le righe contenenti il pattern in questione.
Quindi:
 
sed '/^\( |\t\)*[0-9]\{1,3\}\( |\t\)*$/d' orig.txt
 
Questo funziona e rimuove tutte le righe che
contengono il pattern.
 
Però io vorrei eliminare solo le prime N che
lo contengono e ignorare le successive...
 
Si può fare in qualche modo?
 
PS.
Diciamo anche lo scopo perchè può servire per rispondere:
sono alle prese con un pdf costituito da testo già digi-
talizato, quindi non da immagini di scansioni, che sto
cercando di convertire in un ebook epub.
Con htmltotext ho prodotto un file testuale abbastanza
accettabile, ma ovviamente ancora da ritoccare.
 
Tra le cose che non vanno vi sono i numeri di pagina che
dal pdf vengono mantenuti creando appunto righe con solo
il numero di pagina. E queste righe vanno rimosse...
 
Il problema è che poi ci sono anche alcune altre righe che
contengono solo un numero. Numereo che però non ha a che
fare con la numerazione delle pagine e pertanto vorrei che
queste altre righe, pur coincidendo col pattern vengano
mantenute per poi valutarne la modifica manualmente:
a volte sono righe appartenenti a tabelle o all'indice,
insomma, le voglio poi valutare in un secondo momento.
 
Siccome la numerazione delle pagine è progressiva, posso
verificare con quali sono da cancellare e quali sono da
lasciare.
 
sed -n '/^\( |\t\)*[0-9]\{1,3\}\( |\t\)*$/p' orig.txt
 
Nel caso specifico ho notato che potrei cancellare le
prime 60 righe che contengono il pattern.
 
A me è venuta qualche idea: ad esempio far lavorare
la rimozione con sed solo sulle prime X righe o dalla
riga X alla riga Y del file e ignorare il resto.
Ma non so se sia possibile e come...
 
Ad esempio "cat -n" restituisce il numero della riga
del file, quindi da vedrei da quale riga a quale riga
applicare la rimozione...
 
Qualche idea?
Anche con altri tools tipo awk o perl è tutto benacetto..

 il numero di pagina. E queste righe vanno rimosse...
 
Ti rispondo solo al volo questo: bada che il cambio di pagina e'
caratterizzato, oltre che dal numero di pagina, anche dal carattere
di controllo FF=Form Feed.
Esso e' 014_8 = 12_10 = 0x0c, lo batti con ^v ^l per darlo in pasto
a grep ciao
(ho pochissimo tempo)
 
Ps. "^v ^l" forse vanno solo su console a caratteri e tu se non sbaglio
sei invece su terminale in X.. nonostante la gloriosa Slack ariciao
 
-- 
Yoda
 


Il carattere Form Feed se non ho capito male è quello che si
"vede" come "^L" e nel mio terminale si produce correttamente
con ctrl+v seguito da ctrl+l come hai scritto.
 
Però quando passo il pdf a pdftotext, quest'ultimo probabilmente
elimina il carattere in questione. O comunque, nel mio documento
in testo semplice, non c'è neanche un form-feed.
 
Ho tamponato il problema notando che con sed si può limitare
il campo d'azione delle modifiche alle sole righe comprese
tra la riga M e la riga N con un comando del tipo:
 
sed -n 'M,N{/pattern/p}' testo.txt
 
Quel comando ad esempio stampa le righe che dalla M alla N
contenengono il "pattern".
Mettendo:
M=1
N=$
 
Eseguo la stampa di tutte le righe dell'intero documento
che contengono quel pattern. L'opzione -n impedisce la
stampa delle righe che non contengono il pattern.
 
In questo modo ad esempio posso capire quali sono le righe
da eliminare in tutto il file senza editarlo.
È poi possibile, andando "a tentoni", capire quali valori di M
ed N sono necessari per stampare una successione di righe che
consecutivamente contengono il pattern.
Esempio
 
 
N=1
M=$
-----
1
2
3
4
5
6
7
12
3
4
99
8
9
10
11
2
5
1
33
12
13
14
15
----
 
Questa stampa fatta con sed ci dice che il documento contiene
15 pagine numerate da 1 a 15.
Le righe che contengono i "numeri solitari" che pur contenendo
il pattern (numero solitario) ma rompono la successione da 1 a
15, non sono numerazioni di pagina e dobbiamo preservarle.
Quelle che rispettano la successione invece le dobbiamo rimuovere.
 
Quindi in prima battuta cerco N e M tali per cui vengono stampate
solo le righe che rispettano la successione, quindi nell'esempio
da 1 a 7.
Dipende da come è fatto il documento... mettiamo che siano
M=1 e N=100
 
sed -n '1,100{/pattern/p}'
---
1
2
3
4
5
6
7
---
 
Per cui posso eliminarle effettivamente con lo stesso comando sed,
ma togliendo l'opzione -n e mettendo l'opzione -i che edita il file
e sostituento la "p" con "d" cioè delete line.
 
sed -i '1,100{/pattern/d}'
 
questo mi elimina le numerazioni delle pagine da 1 a 7.
 
Poi modifico M e N per andare ad intercettare la pagina successiva
cioè "8" fino alla "11".
Ovvio che è un lavoro a tentativi perchè non conosco il numero
effettivo della riga da eliminare... Ecco perchè parlavo di "cat -n"
 
Ad ogni modo grazie per la risposta...
Ciao!
 
 
 
 
 
 
 
 
 
 
 
le righe da eliminare

 in testo semplice, non c'è neanche un form-feed.
 
Ho scritto una stupidaggine!
Non capisco come ho fatto a sbagliarmi così di brutto...
Ero stato io stesso ad eliminarli con VIM!
Cancellate pure il mio messaggio precedente...
 
Tra l'altro senza quei caratteri speciali sarebbe molto più complesso
rimuovere automaticamente i numeri di pagina.
Hai ragione conviene basarsi sul from feed.
 
Tanto per capirco meglio, ecco parte di cosa restituisce
 
cat -n raw.txt |grep -B2 "^L"
 
(occhio perchè quel ^L non è tegolina ed L, ma si deve produrre
con ctrl+v ctrl+l come già detto sopra).
 
 
-------------------
   205  9
   206  
   207  ^Ldivision...
--
   239  10
   240  
   241  ^LDi tutte le...
--
   273  11
   274  
   275  ^Lculturale.
--
   307  12
   308  
   309  ^Lfine...
--
   334  13
   335  
   336  ^LNOTA
--
   364  14
   365  
   366  ^LQuesto
--------------------
 
In pratica c'è un "pattern" semplice con cui intercettare i
numeri di pagina ed eliminarne la riga che li contiene.
Lo schema potrebbe essere:
 
- trova il form feed
- vai due righe indietro
- cancella la riga
 
Si tratta quindi di capire come realizzare questa serie
di operazioni in modo più semplice possibile.
 
Da una ricerca vedo che in VIM si potrebbe applicare un
comando del tipo:
 
:g/^L/-2,-1d
 
Questo elimina
la riga contenente il numero di pagina e la riga vuota seguente
ma preserva la riga che contiene come primo carattere appunto il
form feed ^L.
 
Non funziona se il documento inizia con un form feed, perchè
vim non riesce a considerare le due linee precedenti e con ragione
poichè quelle due righe non esistono proprio...
Basta canellare il form feed di inizio documento, niente di chè.
 
Se avete qualceh alternativa per fare la stessa cosa
o con altri programmi come sed, awk, perl o altro, benvenga.
 
Grazie per la dritta Yoda!
Saluti!  :)

 cercando di convertire in un ebook epub.
 
Hai provato con tool come "calibre" e "sigil"?
 
Il primo converte da pdf ad epub usando un po'
di euristica e a volte funziona anche.
 
Il secondo consente di editare epub in vari modi.
 
bye,
 
-- 
 
piergiorgio

 accettabile, ma ovviamente ancora da ritoccare.
 
usa calibre.
 
Ciao Jack

 Il secondo consente di editare epub in vari modi.
 
Sì, ho provato anche a convertire con calibre, che va
molto bene per passare da epub a mobi, ma partendo dal
pdf mi dà un risultato non accettabile. Nella fattispecie
non interpreta correttamente i capoversi e forz l'a-capo
ad ogni riga del pdf. Il risultato è che nell'ebook ho
righe che vanno a capo, non in base alla larghezza del
display, ma alla carlona...
Ecco la necessità di partire allora dal testo semplice
e risolvere lì il problema, mantenendo gli a capo di fine
capoverso ed eliminando gli a capo derivanti dal fine riga
del pdf.
Non so se sono riuscito a spiegarmi...
 
Con Calibre non saprei come aggiustare questo problema,
che lo stesso Calibre produce durante la conversione del
pdf.
 
Sigil l'ho provato, ma mi sembra sia più utile per la
redazione del codice html partendo dal contenuto testuale
dell'ebook per poi produrre l'ebook finale.
 
Per il momento sto provando questa procedura:
 
1- pdftotext per ottenere un formato testo semplice
 
2- vim con 2 regex per:
   2.a.
   - togliere i numeri di pagina
   - rendere i capoversi aderenti al pdf di partenza
     andando a capo solo alla fine del capoverso quindi.
 
Per ora sono arrivato a questo punto... Anche se ho provato
un po' anceh Sigil, ma non so ancora usarlo, cioè non so
proprio cosa devo farci di preciso comunque pensavo di:
 
3- Sigil importare il testo semplice creato al punto 2
   e taggarlo opportunamente in modo da ottenere l'epub
   finale.
 
Poi vedo che alcuni usano anceh libreoffice ecc ed esportano
in html... Ma per il momento proverei semplicemente così...
 
Grazie delle risposte a tutti!
Se vi viene in mente altro da aggiungere dite pure!

 pdf mi dà un risultato non accettabile. Nella fattispecie
 
Mi pare, non ho mai provato direttamente,
che abbia opzioni per pdf e la gestione
dei capoversi.
 
Nella loro documentazione erano abbastanza
chiari riguardo al problema, immagino che
abbiano anche soluzioni.
 
Inoltre sarebbe da vedere se vi sono plugin
specifici per la conversione pdf2epub.
 
bye,
 
-- 
 
piergiorgio

 Se vi viene in mente altro da aggiungere dite pure!
 
Dovresti indicare un link per scaricare un pdf di quelli che tu non
riesci a passare in modo accettabile a epub, perche' altro e' parlare
altro e' fare direttmente; e poi di pdf ce n'e' di troppi formati ciao!
 
Tra l'altro c'e' anche la possibilita' di intervenire sull'epub una
volta convertito, ci sono molti programmi e i cambi di pagina ^L li
vede anche lui ariciao
 
-- 
bye, Yoda
 

 Se vi viene in mente altro da aggiungere dite pure!
 
Per dirne un'altra: tu sei con la splendida Slack dove c'e' mc
installato di default, ebbene prova a dare:
$: mcview pippo.pdf
 
e vedi COME te lo impagina, perche' i pdf, con dentro il testo vero, mc
li visualizza sempre in modo perfetto ciao
Senza contare poi libreoffice, magari te li converte lui stesso in epub!
 
-- 
Yoda
 


Purtroppo non posso indircarti il documento che sto
rimaneggaindo.
Però anche con calibre sono riuscito a convertire il
pdf in epub applicando le due regex in "trova e sostituisci",
nell'ordine ho prima applicato quella relativa alla numerazione
di pagina e quindi quella dell'eliminazione fine righe.
 
Eccole:
-------------------
\d{1,3}<br>\n<hr/>
da sostituire con niente
----------
([^.])<br>
da sostituire con:
\1
------------------
 
Ne viene fuori un epub con qualche "a capo" in meno del dovuto,
quindi è da editare a mano, però tuttosommato si può fare.
 
 
Segnalo qui anche il seguente link che tratta l'argomento
usando altre strade:
http://weborus.com/pdf-kindle-azw3-mobi-line-breaks-issue/
 
 
In effetti portando il pdf in doc sembra rispettare i capolinea...
Anche la formattazione viene preservata, non soperò se sia un
bene o un male al fine di converitre poi il doc in ebook.
 
Poi lì parlano anche di briss per rimaneggiare il pdf prima della
conversione tagliando via le pagine bianche e i numeri di pagina,
ma non lo conosco e non l'ho ancora provato.

 stesso in epub!
 
me lo apre con "draw" poi loposso esportare in html
però nell'html prodotto abbiamo ancora le solite righe
tagliate come nel pdf originale.

 display, ma alla carlona...
 
devi cambiare l'euristica. Ci sono dei howto su google.
 
Ciao Jack


Ho fatto qualche prova: cambiando l'euristica portando
i line-wrap da 0.4 a 0.2... ma niente.
 
Poi ho provato a cambiare invece la stessa opzione ma non
nell'euristica, nelle opzioni di input e ho portato da 0.4
a 0.2. Senza euristica attiva.
Ed effettivamente così i paragrafi risultano più ben messi.
 
Infine ho provato a lasciare 0.2 sull'input e ad attivare
l'euristica lasciando il valore 0.4. Ad occhio mi pare che
venga meglio il risultato senza euristica attiva.
 
Però alla fine il risultato finale va sempre ritoccato a
mano... Quindi non saprei, forse anche il semplice
pdftotext più vim e le due regex che ho provato l'altro
giorno, continuano ad avere un senso... Anche se hanno
l'inconveniente che l'indice (inline) presente nel pdf di
partenza non risulta più attivo, ovvio perchè viene ridotto
da ipertesto a testo semplice....
 
Ad ogni modo le alternative sono molte. Vedrò di fare qualche
prova ancora e proseguire nella caonversione del pdf che ho
sottomano in un ebook epub compiuto. Visto il procedimento più
manuale e capita meglio la struttura di un epub valuterò
eventuali scorciatoie.
 
Aggiungo solo un sito in cui ho trovato indicazioni utili:
https://www.liberliber.it/online/aiuta/progetti/griffo/collaborare/
 
 
Si trova sia il manuale con delle linee guida utili che
un epub campione da cui si può partire per costruire poi
l'ebook derivante dal pdf di partenza.
 
Mi resta qualche dubbio sulla resa delle tabelle, ma per
il resto è tutto spiegato ben nel loro manuale.
 
Ciao a tutti!  :)