Anexe ## a cada linha em um arquivo de texto

30

Quero adicionar hashes a todas as linhas em um arquivo de texto regular. Estou bem com o uso do terminal e da GUI - só preciso fazê-lo.

Oxwivi
fonte

Respostas:

50

Você pode usar sedpara fazer isso:

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

Isso substitui o início da linha ( ^) por ##.

Com a -i.bakopção, sededita o arquivo no local, mas cria uma cópia de backup com extensão .bak.

Jukka Matilainen
fonte
1
+1 Esta é a primeira vez que encontro esse método de backup. Eu sempre tinha um inline diretamente substituir: sed 's/^/##/' -i file. Nesse caso, isso seria preferido, pois não pode dar errado. Em outros casos, esse comando pode ser combinado com diff -u file.bak filepara ver as diferenças (se necessário, canalize-o less). Se estiver confirmado para funcionar, o backup pode ser removido. Caso contrário, poderia ser restaurado com um simples mv file.bak file.
Lekensteyn
1
Elegante. Eu estava pensando em algo assim sed 's/^\(.*\)$/##\1/', mas isso é muito melhor.
organize
Bom .. Eu estava pensando em sugerir que o Vim fizesse isso ... #
623
Isso me ajudou a converter um arquivo da lista de bloqueios :) Thank you 1+
Neil
8

Aqui está uma solução para esse problema usando perl

perl -e 'while (<>) {print "##$_"}' < infile > outfile
beav_35
fonte
2
O -pswitch também é útil: perl -pe 's/^/##/' infile > outfile. (Também existe a -i[extension]opção de substituir o arquivo de destino no local.) Perldoc.perl.org/perlrun.html#%2a-p%2a
Jukka Matilainen
6

Enquanto estamos nisso:

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

Isso usa o (relativamente novo) plugin de edição local para o GNU awk 4.1.0+.

muru
fonte
4

Aqui está uma bashmaneira:

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

( No bashshell , executar read -rsem outros argumentos funciona como IFS= read -r REPLY.)

Isso é estilisticamente inspirado na solução perl do beav_35 , que eu admito que provavelmente roda muito mais rápido em arquivos enormes, já perlque se espera que seja mais eficiente do que um shell quando se trata de processamento de texto.

Eliah Kagan
fonte
3

sed -inão é padrão POSIX, portanto, se você é um purista, convém usar ed:

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

Aqui está uma perlmaneira mais fácil do que a apresentada em outros lugares:

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

Este (ab) usa o fato de que perl -pimprime a linha após executar o comando fornecido em -e.

abligh
fonte
0

Você pode usar o Vim no modo Ex:

ex -sc '%s/^/##/|x' file
  1. % selecione todas as linhas

  2. s substituto

  3. x salvar e fechar

Steven Penny
fonte
0

Pode ser feito com a função de mapeamento do python e redirecionando 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

Salve a saída no novo arquivo e use-o em vez do original

Sergiy Kolodyazhnyy
fonte