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

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

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

Responder1

:|paste -d'foo ' - - - - input > output

(brincadeirinha, embora você provavelmente descubra 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 adaptado a strings arbitrárias. Por exemplo,

sed "s/^/$var /"

Só funciona se $varnão contiver, &, \, /nem caracteres de nova linha, e é uma vulnerabilidade de execução de comando arbitrária no GNU sed, pelo menos se isso não puder ser garantido.

A esse respeito,

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

ou

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

funcionaria melhor.

Responder2

Você pode usar sed:

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

Graças aos comentários de Stephane e Marco, observe que a -iopção 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 realizam uma substituição de regex, substituindo o início de uma linha ( ^) pela string desejada. A -iopção em ambos os comandos garante que o arquivo seja editado no local (ou seja, as alterações são refletidas no arquivo em vez de impressas no stdout).

seddeve estar disponível em qualquer sistema operacional compatível com POSIX e perldeve estar disponível na maioria dos Unices modernos, exceto talvez aqueles quepassaram pelo esforçode removê-lo.

Responder3

Apresento uma solução prefixando awka string “foo”.

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

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

{ rm file; awk '{ print "foo", $0 }' > file; } < file

Responder4

Você pode usar perlpara 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

informação relacionada