2013-04-12 29 views
50

Sono sulla linea di comando di Linux e ho file conaggiungere testo alla fine di ogni riga

127.0.0.1 
128.0.0.0 
121.121.33.111 

voglio

127.0.0.1:80 
128.0.0.0:80 
121.121.33.111:80 

mi ricordo i miei colleghi stavano usando sed per questo, ma dopo aver letto il manuale sed ancora non è chiaro come farlo sulla linea di comando?

risposta

80

Si potrebbe provare a utilizzare qualcosa come:.

sed 's/$/:80/' ips.txt > new-ips.txt 

** A condizione che il formato del file è proprio come hai descritto nella sua domanda *

Le partite comando s/// sostituzione (trova) la fine di ogni riga nel file (utilizzando il carattere $) e quindi aggiunge (sostituisce) il :80 alla fine di ogni riga. Il file ips.txt è il file di input e ... new-ips.txt è il file appena creato (il risultato finale delle modifiche.)


Inoltre, se si dispone di una lista di numeri IP che capita di avere numeri di porta attaccati già, (come notato da Vlad e come dato da aragaer,) si potrebbe provare a utilizzare qualcosa di simile:

sed '/:[0-9]*$/ ! s/$/:80/' ips.txt > new-ips.txt 

Così, per esempio, se il file di input sembrava qualcosa di simile (notare il :80):

127.0.0.1 
128.0.0.0:80 
121.121.33.111 

il risultato finale sarebbe simile a questa:

127.0.0.1:80 
128.0.0.0:80 
121.121.33.111:80 
+0

Aggiungerà ': 80' a una riga in cui': 80' è già stato aggiunto? – Vlad

+0

@Vlad Sì; ma secondo l'OP esempio di input in ingresso ... non ci dovrebbero essere numeri di porta nella lista degli IP. :) Anche se ci fosse ... l'OP potrebbe semplicemente eseguire un altro sed 's ///' in precedenza per estrarre qualsiasi numero di porta alla fine di ogni riga. – summea

+1

Ok, basta chiarire ... Forse dovrebbe esserci una condizione per escludere le linee in cui esiste già una porta. – Vlad

10
sed 's/.*/&:80/' abcd.txt >abcde.txt 
8

Se vuoi aggiungere testo alla fine di ogni riga sul posto (nello stesso file), è possibile utilizzare -i parametro, ad esempio:

sed -i'.bak' 's/$/:80/' foo.txt 

opzione Tuttavia -i è n estensione Unix standard e potrebbe non essere disponibile su tutti i sistemi operativi.

Così si può considerare l'utilizzo di ex (che equivale a vi -e/vim -e):

ex +"%s/$/:80/g" -cwq foo.txt 

che aggiungerà :80 ad ogni riga, ma a volte è possibile aggiungere a righe vuote.

Così metodo migliore è quello di verificare se la linea in realtà contiene un numero qualsiasi, e quindi aggiungere, ad esempio:

ex +"g/[0-9]/s/$/:80/g" -cwq foo.txt 

Se il file ha formato più complessa, considerare l'utilizzo di una corretta espressione regolare, invece di [0-9].

0

Utilizzando un editor di testo, verificare ^M (control-M o ritorno a capo) alla fine di ogni riga. Dovrai prima rimuoverli, quindi aggiungere il testo aggiuntivo alla fine della riga.

sed -i 's|^M||g' ips.txt 
sed -i 's|$|:80|g' ips.txt 
Problemi correlati