Prependi ## su ogni riga di un file di testo


30

Voglio aggiungere hash a tutte le righe in un normale file di testo. Sto bene sia con l'uso del terminale che con la GUI: ho solo bisogno di farlo.

Risposte:


50

Puoi usare sedper farlo:

sed -i.bak 's/^/##/' file

Questo sostituisce l'inizio della riga ( ^) con ##.

Con l' -i.bakopzione, sedmodifica il file sul posto, ma crea una copia di backup con estensione .bak.


1
+1 Questa è la prima volta che incontro questo metodo di backup. Ho sempre avuto un inline sostituire direttamente: sed 's/^/##/' -i file. In questo caso, questo sarebbe preferibile poiché non può andare storto. In altri casi, questo comando può essere combinato con diff -u file.bak fileper vedere le differenze (se necessario, passalo attraverso less). Se si conferma che funzioni, il backup può essere rimosso. Altrimenti potrebbe essere ripristinato con un semplice mv file.bak file.
Lekensteyn,

1
Elegante. Stavo pensando a qualcosa del genere sed 's/^\(.*\)$/##\1/', ma è molto più bello.
organizzare il

Bello ... Stavo pensando di suggerire a Vim di fare questo ...
Sathish,

Questo mi ha aiutato a convertire un file dell'elenco di blocchi :) Grazie 1+
Neil

8

Ecco una soluzione a questo problema usando perl

perl -e 'while (<>) {print "##$_"}' < infile > outfile

2
L' -pinterruttore è anche utile: perl -pe 's/^/##/' infile > outfile. (C'è anche l' -i[extension]
opzione

6

Mentre ci siamo:

gawk -i inplace '{print "##"$0}' infile

Questo utilizza il plug-in di modifica sul posto (relativamente nuovo) per GNU awk 4.1.0+.


4

Ecco un bashmodo:

while read -r; do printf '##%s\n' "$REPLY"; done < infile > outfile

( Nella bashshell , l'esecuzione read -rsenza altri argomenti funziona come IFS= read -r REPLY.)

Questo è ispirato stilisticamente dalla soluzione perl di beav_35 , che ammetto probabilmente funziona molto più velocemente per file di grandi dimensioni, dal momento che ci si perlpuò aspettare che sia più efficiente di una shell quando si tratta di elaborazione del testo.


3

sed -inon è standard POSIX, quindi se sei un purista vorrai utilizzare ed:

printf ",s/^/##/\nw\nq" | ed -s file.txt

3

Ecco un perlmodo più semplice di quello presentato altrove:

perl -pi -e 'print "##"' YOURFILEHERE

Questo (ab) utilizza il fatto che perl -pstampa la riga dopo aver eseguito il comando indicato -e.


0

Puoi usare Vim in modalità Ex:

ex -sc '%s/^/##/|x' file
  1. % seleziona tutte le righe

  2. s sostituire

  3. x salva e chiudi


0

Può essere fatto con la funzione di mappatura di Python e reindirizzare lo stdin:

$ cat input.txt                                                                                                          
lorem ipsum
quick brown fox
hello world
$ python -c 'import sys;print "".join(map(lambda x: "##"+x,sys.stdin.readlines()))'  < input.txt                         
##lorem ipsum
##quick brown fox
##hello world

Salva l'output in un nuovo file e usalo al posto dell'originale

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.