Qual é a maneira mais fácil de adicionar uma string no início de cada linha do arquivo a partir da linha de comando?

8

Eu estou procurando uma maneira de adicionar alguma string ao início de cada linha (mesma string para cada linha). Não é algo personalizável, mas sim algo que será fácil de lembrar e disponível em todas as plataformas compatíveis com POSIX (e também em cada shell).

    
por syntagma 08.10.2013 / 20:58

7 respostas

8

Você pode usar sed :

sed -i 's/^/your_string /' your_file

Graças aos comentários de Stephane e Marco, note que a opção -i não é POSIX. Uma maneira POSIX de fazer o acima seria

sed 's/^/your_string /' your_file > tmp_copy && mv tmp_copy your_file

ou perl :

perl -pi -e 's/^/your_string /' your_file

Explicação

Ambos os comandos executam uma substituição de regex, substituindo o início de uma linha ( ^ ) pela sua string desejada. A opção -i em ambos os comandos garante que o arquivo seja editado (ou seja, as alterações são refletidas no arquivo em vez de impressas no stdout).

sed deve estar disponível em qualquer sistema operacional compatível com POSIX e perl deve estar disponível na maioria dos Unices modernos, exceto talvez para aqueles que passaram pelo esforço de removê-lo.

    
por 08.10.2013 / 21:02
14
:|paste -d'foo ' - - - - input > output

(brincadeirinha, embora você provavelmente ache que é a mais rápida de todas as soluções postadas aqui: -b).

A maneira canônica é:

sed 's/^/foo /' < input > output

No entanto, não é facilmente adaptável a cadeias arbitrárias. Por exemplo,

sed "s/^/$var /"

Funciona somente se $var não contiver, & , \ , / nem caracteres de nova linha.

A esse respeito,

export var
awk '{print ENVIRON["var"], $0}'

ou

perl -pe '$_="$ENV{var} $_"'

funcionaria melhor.

    
por 08.10.2013 / 22:08
4

Eu apresento uma solução usando awk prefixando a string "foo".

awk '{ print "foo", $0; }' input > output

awk é multi-plataforma e está disponível em qualquer sistema POSIX. Não faz edição no local. Se você quiser editar um arquivo sem criar um segundo, terá que usar um arquivo temporário. Veja a resposta sed de Joseph, mostra a sintaxe. Outro truque é usar a seguinte sintaxe, que basicamente cria um arquivo temporário com o mesmo nome de arquivo do arquivo original.

{ rm file; awk '{ print "foo", $0 }' > file; } < file
    
por 08.10.2013 / 21:14
4

Você pode evitar os problemas de edição no local com as ferramentas de fluxo usando uma ferramenta que normalmente faz uma edição no local - um editor!

ex sample.txt -c "%s/^/foo /" -c wq

Existe uma vantagem adicional de que os comandos são fáceis e óbvios para qualquer pessoa versada no único editor verdadeiro.

    
por 09.10.2013 / 02:46
2

Você pode usar perl para fazer isso:

$ perl -pi -e 's/^/mystring /' afile.txt

Exemplo

Crie um arquivo de amostra.

$ seq 5 > afile.txt

$ cat afile.txt
1
2
3
4
5

Execute o comando acima:

$ perl -pi -e 's/^/mystring /' afile.txt

$ cat afile.txt
mystring 1
mystring 2
mystring 3
mystring 4
mystring 5
    
por 08.10.2013 / 21:06
1

Usando simplesmente o Bash

 while IFS= read -r line; do echo "foo" "${line}" ; done  < input > Output

Usando o Python

python -c "import sys; print 'foo '.join([ l for l in sys.stdin.readlines() ])" < input > Output

Se você quiser editar no local

import fileinput
import sys

for line in fileinput.input(['inputfile'], inplace=True):
    sys.stdout.write('foo {l}'.format(l=line))

link de referência

    
por 08.10.2013 / 22:10
-1

Ou você pode fazer o seguinte:

vi filename.txt

Esc (para garantir que você está no modo NORMAL ) e, em seguida, digite o seguinte comando:

:1,$ s/^/mystring
    
por 12.09.2014 / 16:05