Anteponer ## a cada línea en un archivo de texto

30

Quiero agregar hashes a todas las líneas en un archivo de texto normal. Estoy bien con el uso de terminal y GUI, solo necesito hacerlo.

Oxwivi
fuente

Respuestas:

50

Puedes usar sedpara hacer eso:

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

Esto reemplaza el inicio de la línea ( ^) con ##.

Con el -i.bakinterruptor, sededita el archivo en su lugar, pero crea una copia de seguridad con extensión .bak.

Jukka Matilainen
fuente
1
+1 Esta es la primera vez que encuentro este método de respaldo. Siempre tenía una línea reemplazar directamente: sed 's/^/##/' -i file. En este caso, esto sería preferible ya que no puede salir mal. En otros casos, este comando se puede combinar diff -u file.bak filepara ver las diferencias (si es necesario, canalizarlo less). Si se confirma que funciona, la copia de seguridad se puede eliminar. De lo contrario, podría restaurarse con un simple mv file.bak file.
Lekensteyn
1
Elegante. Estaba pensando en algo así sed 's/^\(.*\)$/##\1/', pero esto es mucho mejor.
organizar el
Bonito ... estaba pensando en sugerirle a Vim que hiciera esto ...
Sathish
Esto me ayudó a convertir un archivo de lista de bloqueo :) Gracias 1+
Neil
8

Aquí hay una solución a este problema usando perl

perl -e 'while (<>) {print "##$_"}' < infile > outfile
beav_35
fuente
2
El -pinterruptor también es útil: perl -pe 's/^/##/' infile > outfile. (También existe el -i[extension]interruptor para reemplazar el archivo de destino en el lugar.) Perldoc.perl.org/perlrun.html#%2a-p%2a
Jukka Matilainen
4

Aquí hay una bashmanera:

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

( En el bashshell , ejecutar read -rsin otros argumentos funciona como IFS= read -r REPLY).

Esto está inspirado estilísticamente en la solución perl de beav_35 , que admito que probablemente se ejecuta mucho más rápido para archivos de gran tamaño, ya perlque se espera que sea más eficiente que un shell cuando se trata de procesamiento de texto.

Eliah Kagan
fuente
3

sed -ino es estándar POSIX, por lo que si eres un purista querrás usar ed:

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

Aquí hay una perlmanera más fácil que la presentada en otros lugares:

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

Esto (ab) utiliza el hecho de que perl -pimprime la línea después de ejecutar el comando dado en -e.

abligh
fuente
0

Puede usar Vim en modo Ex:

ex -sc '%s/^/##/|x' file
  1. % seleccione todas las líneas

  2. s sustituir

  3. x guardar y cerrar

Steven Penny
fuente
0

Se puede hacer con la función de mapeo de python y la redirección de 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

Guarde el resultado en un archivo nuevo y úselo en lugar del original

Sergiy Kolodyazhnyy
fuente