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.

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.


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

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.


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

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.


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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.