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.

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.


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



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.


3

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

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

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.


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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.