Vai al contenuto
OneKitly

Numerare le righe di un testo per una revisione a più mani

Pubblicato il 12/08/2026 · 15 min di lettura · Strumenti testo e lingua

Daniel Okonkwo

Daniel OkonkwoSviluppatore front-end e redattore Tech presso OneKitly

Performance web · Formati di file

Verificato su 3 fonti

Vedi il profilo
In breve

Incolla il testo in add-line-numbers e ogni riga riceve un numero davanti, a partire da 1. Il campo «Inizia da» accetta altri valori, ma non lo zero: il codice legge Number(start) || 1, e 0 è falsy, quindi 0 torna a essere 1. Gli avvii negativi funzionano: metti −3 su tre righe e ottieni −3, −2, −1. L'allineamento è automatico e usa spazi, mai zeri iniziali: la larghezza viene dall'ultimo numero, così 102 righe danno « 1. » fino a « 102. », e un testo di 99 righe dà « 1. » con un solo spazio. Il separatore predefinito è un punto seguito da uno spazio; ne sono offerti altri dieci, fra cui « 1) », « 1: », « [1] », « #1 » e una tabulazione. Il ritorno è asimmetrico, ma non è più distruttivo. remove-line-numbers conosce un solo schema — spazi iniziali, cifre, un separatore preso da un insieme di otto, poi un singolo spazio o la fine della riga — quindi annulla otto degli undici e lascia di proposito il trattino, la barra verticale e lo spazio semplice: «10 - 20 people» e «1 | Alice | 30» sono contenuto molto più spesso che numerazione. Poiché ora prende un solo spazio invece di una sequenza golosa, numerare JavaScript indentato e poi togliere i numeri restituisce il codice byte per byte, indentazione compresa. E poiché un separatore deve essere seguito da uno spazio, «3.14 is pi» e «12.50 Coffee» restano dove sono. Ciò che nessuna regola può salvare è una riga identica all'output dello strumento stesso: «2026. A year.» torna ancora come «A year.» Numera una copia, tieni l'originale.

La numerazione parte da 1 e non si può impostare a 0, l'allineamento usa spazi e non zeri, e lo strumento che li toglie annulla otto degli undici separatori senza toccare l'indentazione. Quello che ancora non sa fare è distinguere i tuoi numeri dai suoi.

Perché un testo condiviso ha bisogno di numeri

Il codice arriva già con i numeri. L'editor li stampa nel margine sinistro, un diff li stampa da entrambi i lati della modifica e un commento di revisione su una piattaforma di hosting si aggancia a uno di essi. La prosa no. Una clausola di contratto, una serie di sottotitoli, un export di memoria di traduzione, un elenco di nomi di prodotto da controllare in due: nessuno di questi testi ha un modo stabile di dire «il quarto dall'alto» che non sia contare.

È il conteggio a mano che manda in malora la revisione. Due persone contano da punti diversi, una include la riga vuota e l'altra no, e un'ora dopo ci sono due correzioni sulla stessa clausola e una su una clausola che nessuno voleva toccare. Attaccare un numero a ogni riga prima di far circolare il testo elimina tutta questa famiglia di equivoci al prezzo di un incolla.

La parola importante è «prima». I numeri sono un sistema di coordinate, e un sistema di coordinate serve solo finché sta fermo. Se qualcuno rinumera un testo già annotato, ogni commento diventa un indovinello. Numera una volta, fai circolare esattamente quella versione e raccogli le correzioni rispetto a essa.

Che cosa produce davvero lo strumento

L'impostazione predefinita è un punto seguito da uno spazio: «first line» diventa «1. first line». Sono offerti altri dieci separatori: «1) », «1: », «1 - », «1 | », «[1] », «1] », «#1 », «1 → », uno spazio semplice e una tabulazione. Due di essi racchiudono il numero invece di seguirlo, ed è per questo che «[1] » e «#1 » hanno un aspetto diverso.

L'allineamento si calcola dall'ultimo numero e si applica con spazi normali, non con zeri. Un testo di 102 righe torna con « 1. line1» in cima e « 102. line102» in fondo, con le cifre allineate a destra. La larghezza si decide una volta sola, prima della prima riga, quindi un testo di 99 righe ha larghezza due e uno di 100 righe larghezza tre: uno spazio in più su ogni riga per una sola riga aggiunta. Se stai confrontando due versioni numerate, ecco perché tutte le righe risultano modificate.

Vale la pena conoscere tre piccoli comportamenti prima di incollare qualcosa di lungo. Un a capo finale produce una riga vuota numerata in fondo, perché dividere «a\nb\n» sugli a capo dà tre pezzi e il terzo è vuoto: l'output finisce con «3. ». Un input vuoto produce «1. » anziché nulla. E un input con fine riga Windows torna con fine riga Unix: la divisione accetta un ritorno a capo prima dell'avanzamento di riga, ma la ricomposizione rimette solo l'avanzamento di riga.

Iniziare da 1, e solo da 1 — o da un numero negativo

Il campo «Inizia da» esiste perché un estratto numerato di solito viene da qualche parte: la pagina quattro di una trascrizione non dovrebbe ripartire da 1. Mettilo a 500 e l'output dà 500, 501, 502, con larghezza tre. Fin qui funziona come promesso.

Lo zero è l'eccezione, e non è un difetto che si aggiri scrivendolo in altro modo. Il valore è letto come Number(start) || 1. Lo zero è uno dei valori falsy di JavaScript, quindi l'espressione ricade su 1: digitare 0 e non digitare nulla danno lo stesso risultato. Chi voleva una numerazione in stile array, con la prima riga come riga 0, qui non l'avrà. Un campo vuoto si comporta allo stesso modo, e anche un valore che non è un numero: «abc» dà 1.

Gli avvii negativi, curiosamente, funzionano, perché −3 è truthy. Tre righe che partono da −3 tornano come «-3. », «-2. », «-1. »: non serve a nulla di preciso, ma dice che la protezione riguarda la falsiness e non il segno. I valori frazionari sono arrotondati verso meno infinito: 2,7 diventa 2 e −2,7 diventa −3.

Il ritorno, che non è simmetrico

remove-line-numbers non ha alcuna opzione. Applica un unico schema a ogni riga: spazi o tabulazioni iniziali, poi il numero e il suo marcatore — cifre seguite da una tabulazione, o cifre fra parentesi quadre o precedute da un cancelletto, o cifre seguite da un punto, una parentesi chiusa, due punti, una parentesi quadra chiusa o una freccia — e infine un solo spazio, oppure la fine della riga. Tutto ciò che combacia viene cancellato, una volta per riga. Due dettagli di quella frase fanno tutto il lavoro: il marcatore deve essere seguito da uno spazio, e lo spazio consumato è esattamente uno.

Passa tutti e undici i separatori nello strumento e otto sopravvivono al viaggio: punto, parentesi, due punti, tabulazione, «[1] », «1] », «#1 » e «1 → » tornano esattamente al testo di partenza. Tre no, e l'omissione è voluta. «1 - alpha», «1 | alpha» e «1 alpha» tornano immutati, numeri ancora attaccati, perché «5 - 3 = 2», «10 - 20 people», «1 | Alice | 30» e «007 James» hanno esattamente la stessa forma e sono contenuto molto più spesso che numerazione. Uno strumento di rimozione che annullasse quei tre si mangerebbe una riga di foglio di calcolo ogni volta che qualcuno ne incolla una.

Lo schema finiva con una sequenza golosa di spazi, che si portava via l'indentazione del testo; ora ne prende esattamente uno. Numera cinque righe di JavaScript con una funzione, un if e un return, togli i numeri, e il file torna byte per byte, indentazioni comprese. YAML e Python si comportano allo stesso modo, ed è lì che conta di più: in quei due linguaggi un risultato appiattito non è solo brutto, non vuole più dire la stessa cosa.

Chi rimuove non può sapere di chi sia il numero

Questo è il limite onesto dell'intera idea, e la regola dello spazio lo restringe senza toglierlo. «1. Lavare il riso» è una riga numerata se l'1 ce l'ha messo lo strumento, ed è contenuto se ce l'ha messo il cuoco. Nulla nella stringa distingue le due cose, e nessuno schema può farlo: quelle due righe sono gli stessi byte. Pretendere uno spazio dopo il separatore esclude gli incidenti — «3.14 is pi» e «1.2.3 version» tornano ora intatti, perché un punto decimale non è mai seguito da uno spazio — ma non esclude le coincidenze. «12: 30 departure» torna ancora come «30 departure». «2026. A year.» torna ancora come «A year.» Entrambe sono, carattere per carattere, ciò che add-line-numbers scrive; su una riga che nessuno ha numerato, resta perdita di dati.

Due cose tengono al sicuro il caso ordinario. La cancellazione avviene una volta per riga e si ferma al primo separatore: un listino scritto all'inglese, numerato, dà «1. 12.50 Coffee», e togliere il numero riconosce «1. » e si ferma, restituendo «12.50 Coffee» intatto; un elenco che aveva già i suoi numeri, «1. 1. alpha», perde esattamente un livello. E quella riga di prezzo ora sopravvive anche senza la numerazione, perché il punto di «12.50» non è seguito da uno spazio. Il viaggio di andata e ritorno è quindi sicuro su qualunque testo, indentato o piatto, con uno qualsiasi degli otto separatori. A mordere resta solo lo strumento di rimozione da sé, applicato a un testo che nessuno ha numerato, sul ristretto insieme di righe che somigliano al suo stesso output.

Capire perché qualcosa è sicuro è più utile dell'elenco. Un CSV di identificativi sopravvive — «1024, Dupont, 42» torna intatto — perché il carattere dopo le cifre è una virgola, e la virgola non compare in nessuna delle forme di marcatore. «100 units of flour» e «007 James» sopravvivono perché nemmeno uno spazio semplice lo è. I decimali e le versioni semantiche sono sicuri anch'essi, ma per l'altra ragione: «3.14» e «1.2.3» un punto ce l'hanno, e a salvarli è che non lo segue alcuno spazio. A rischio è il ristretto insieme in cui un numero, un marcatore riconosciuto e uno spazio arrivano in quest'ordine: gli anni usati come titoli, «12: 30» scritto con lo spazio dopo i due punti, e — novità da quando l'insieme dei marcatori si è allargato — i richiami di nota del tipo «[1] » e le righe che aprono con «#1 ».

Condurre la revisione senza perdere nulla

Tieni l'originale non numerato dove non lo sovrascriverai e tratta la versione numerata come una stampa: qualcosa da leggere, citare e annotare, non da modificare e rispedire. Ogni correzione raccolta come «riga 47, sostituire X con Y» si applica pulitamente all'originale, e i numeri non vanno mai tolti.

Se hai davvero intenzione di togliere i numeri più tardi, evita esattamente tre separatori: il trattino, la barra verticale e lo spazio semplice. Tutto il resto del menù — punto, parentesi, due punti, tabulazione, «[1] », «1] », «#1 », «1 → » — si toglie senza problemi. Preferisci la tabulazione se il testo passerà vicino a un foglio di calcolo: mette i numeri in una colonna propria.

Numerare codice che intendi reincollare ora è sostenibile, cosa che prima non era: con un punto, una parentesi, due punti o una tabulazione il file torna byte per byte, indentazione compresa. Resta comunque di rado la mossa giusta — una revisione di codice ha strumenti migliori: un diff, una pull request, o semplicemente i numeri di riga che l'editor sta già mostrando a entrambi — ma se lo fai, scegli uno di quei quattro e prova prima l'andata e ritorno su una copia.

Una riga in ingresso, una in uscita, passata in entrambi gli strumenti
InputRisultatoPerché
«Inizia da» impostato a 0, due righe1. a e 2. bNumber(start) || 1 — lo zero è falsy, quindi diventa 1
«Inizia da» impostato a −3, tre righe-3. a, -2. b, -1. cUn numero negativo è truthy, quindi la protezione lo lascia passare
Un testo di 102 righe, separatore predefinito« 1. » in cima, « 102. » in fondoAllineato a destra con spazi; la larghezza viene dall'ultimo numero
Testo che finisce con un a capoUna riga vuota numerata in fondoDividere sugli a capo dà un pezzo in più delle righe di testo
«1 - alpha» in remove-line-numbersImmutatoIl trattino è escluso di proposito: «10 - 20 people» è contenuto molto più spesso che numerazione
Cinque righe di JavaScript indentato, numerate e poi denumerateIl codice torna byte per byte, indentazioni compreseLo schema prende esattamente uno spazio dopo il separatore, non una sequenza golosa
«3.14 is pi», mai numerata, nello strumento di rimozioneImmutatoUn separatore deve essere seguito da uno spazio, e un punto decimale non lo è mai
«1024, Dupont, 42», mai numerata, nello strumento di rimozioneImmutatoLa virgola non compare in nessuna delle otto forme di marcatore, quindi nulla combacia
«1. 12,50 Caffè», numerata dallo strumento, nello strumento di rimozione«12,50 Caffè» — il viaggio di andata e ritorno non perde nullaLa sostituzione gira una volta per riga e si ferma al primo separatore
Aggiungi numeri di rigaAnteponi a ogni riga un numero di riga progressivo.Prova lo strumento

Domande frequenti

Posso far partire la numerazione da 0?
No, e non c'è trucco che lo aggiri. Lo strumento legge il campo come Number(start) || 1. Lo zero è falsy in JavaScript, quindi l'espressione lo scarta e restituisce 1: digitare 0, lasciare il campo vuoto o digitare una parola producono tutti un elenco che parte da 1. Verificato con 0, «0», «» e «abc»: tutti e quattro hanno dato lo stesso output. Se ti serve una numerazione da zero, numera da 1 e sottrai uno a mente, oppure numera da −1 se conta più lo scarto del segno: gli avvii negativi funzionano, perché un numero negativo è truthy.
I numeri restano allineati una volta superate le 100 righe?
Sì. La larghezza è calcolata dall'ultimo numero prima di scrivere qualsiasi cosa, e ogni numero è riempito a sinistra con spazi fino a quella larghezza. Un testo di 102 righe comincia con due spazi davanti alla riga 1 e nessuno davanti alla 102: i punti formano una colonna dritta. Non ci sono zeri iniziali: ottieni « 7. », mai «007. ». Una conseguenza coglie molti di sorpresa: un testo di 99 righe usa larghezza due e lo stesso testo con una riga in più usa larghezza tre, quindi ogni riga cambia di uno spazio. Se confronti due versioni numerate con un diff, ecco perché l'intero file sembra modificato. Confronta piuttosto gli originali.
remove-line-numbers annulla sempre add-line-numbers?
No, ma le ragioni sono cambiate. Riconosce otto degli undici separatori — punto, parentesi chiusa, due punti, tabulazione, «[1] », «1] », «#1 » e «1 → » — e lascia di proposito il trattino, la barra verticale e lo spazio semplice, perché «10 - 20 people», «1 | Alice | 30» e «007 James» hanno la stessa forma e di solito sono contenuto. Con un separatore riconosciuto il viaggio di andata e ritorno è ora byte per byte, indentazione compresa: cinque righe di JavaScript con un corpo di funzione indentato di quattro e otto spazi sono entrate e tornate identiche, e lo stesso vale per YAML, Python e un listino piatto.
Ho passato lo strumento di rimozione su un listino e ne ha mangiato una parte. Cos'è successo?
Non può più farlo. Un tempo lo strumento cancellava le cifre iniziali seguite da un punto, una parentesi chiusa, due punti o una tabulazione, senza pretendere nulla dopo: così «3.14 is pi» diventava «14 is pi» e «12.50 Coffee» diventava «50 Coffee». Lo schema ora pretende uno spazio, o la fine della riga, dopo il separatore, e un punto decimale non è mai seguito da uno spazio: «3.14 is pi», «1.2.3 version» e «12.50 Coffee» tornano tutti intatti. Ciò che può ancora portarsi via è una riga con la forma esatta del suo stesso output — «2026. A year.» dà «A year.», «12: 30 departure» dà «30 departure» — e, da quando l'insieme dei marcatori si è allargato, i richiami di nota: «[1] See note» dà «See note». Un elenco separato da virgole è sicuro in ogni caso, perché la virgola non compare in nessuna forma di marcatore.
Devo numerare codice sorgente per una revisione del codice?
Di solito no, anche se non è più rischioso. Il codice porta già i numeri di riga ovunque venga letto — nel margine dell'editor, in un diff, nell'interfaccia di revisione di qualsiasi piattaforma — quindi numerarlo aggiunge soprattutto rumore. Il ritorno però ora lo regge: con un punto, una parentesi, due punti o una tabulazione, numerare un file indentato e togliere i numeri lo restituisce byte per byte, indentazione compresa, cosa che prima non accadeva. Tre separatori continuano a non essere mai rimossi — il trattino, la barra verticale e lo spazio semplice — quindi evitali se i numeri devono poi sparire. La numerazione si guadagna il posto su testi senza numeri propri, letti fuori da uno strumento che li fornisca: un contratto diffuso come documento, un file di sottotitoli discusso in una conversazione, un elenco di stringhe mandato a un traduttore. Se stai rivedendo codice e la piattaforma è fuori portata, citarlo in un blocco e riferirti a esso per nome di funzione resta la via più tranquilla.

Articoli che potrebbero interessarti

Tutte le guide
TutorialFiltrare righe secondo uno schema, senza riga di comandoQuesto è grep per chi non usa grep, con una differenza importante: la ricerca è una sottostringa letterale, quindi una vera espressione regolare restituisce un riquadro vuoto e nessun errore. Ogni affermazione è stata verificata eseguendo lo strumento.SpiegazioneOrdinare il testo non è una sola operazione: quattro ordini che si dicono tutti alfabeticiOrdine per unità di codice, ordine naturale e collazione per locale eseguiti sulla stessa lista in Node, con gli output stampati. Perché Zebra precede apple, perché item10 precede item9 e perché ä sta accanto ad a in tedesco ma dopo la z in svedese.SpiegazioneTrovare i duplicati di un elenco senza foglio di calcoloDue righe che sembrano identiche spesso non lo sono. Le maiuscole, uno spazio finale, uno spazio unificatore e due codifiche diverse della stessa lettera accentata sono stati passati nel rilevatore di duplicati, che in tre casi su quattro non ne ha segnalato nessuno.GuidaTrova e sostituisci: le trappole delle espressioni regolari, dimostrate una per unaGoloso contro pigro sulla stessa stringa, il punto che salta gli a capo, $& e $$ nella sostituzione, una regex /g riusata che salta una riga in silenzio, e perché /i non sa nulla della i turca. Ogni guasto eseguito in Node, con una routine conta-poi-sostituisci che li intercetta.TutorialBasi delle regex: guida per principiantiUn'espressione regolare è un modello per cercare testo. Ecco i mattoni — classi di caratteri, quantificatori e ancore — con un esempio.SpiegazioneRilevare la lingua di un testo, e perché i testi brevi fallisconoMisurato, non affermato: 90 frasi brevi reali in sei lingue, nessuna rifiutata e 68 giuste — il 76%, che scende al 64% sotto le sedici lettere. Quattro delle risposte sbagliate sono tornate con il 100% di fiducia.

Strumenti correlati

Tutto quanto segue descrive ciò che questi quattro strumenti fanno oggi, verificato eseguendo il loro stesso codice sugli input esatti riportati in ogni articolo, e non ciò che una norma imponga loro. Dove uno strumento sbaglia un caso, la cosa è scritta chiaramente anziché aggirata, e nulla è stato modificato perché un articolo si leggesse meglio. Due conseguenze. Esegui ogni trasformazione prima su una copia e confronta i due estremi: uno strumento di testo che cancella qualcosa non lo dice. E considera condiviso un segreto dal momento in cui lascia la pagina: incollarlo in una chat, in un ticket o in un repository lo brucia, per quanto bene sia stato generato.

Fonti

Hai notato un errore in questo articolo?