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 $var
nã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 -i
opçã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 -i
opçã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).
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 aqueles quepassaram pelo esforçode removê-lo.
Responder3
Apresento uma solução prefixando awk
a 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 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