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 executam uma substituição de regex, substituindo o início de uma linha ( ^
) pela string desejada. A -i
opção nos dois 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
estar disponível na maioria dos Unices modernos, exceto talvez nos que passaram pelo esforço de removê-lo.
-i
opção não edita o arquivo no local. Ele cria um novo arquivo e sobrescreve o original após a conclusão (prova: o inode é alterado). Não existem muitas ferramentas que efetuem a edição no local, o que é uma operação perigosa. Além disso, como você menciona o POSIX, o-i
switch não é obrigatório para um compatível com POSIXsed
, é um recurso de algumas implementações específicas.sed -i
não é POSIX. É o GNU. O FreeBSDsed
tem uma opção semelhante, mas você precisa desed -i ''
lá.-i
cria uma cópia temporária (é por isso que eu disse que as alterações são refletidas no arquivo original); Eu quis dizer que você obtém a mesma semântica que a substituição no local. Verifique se a resposta atualizada é compatível com POSIX.$$
(o ID do processo do shell atual) como parte de um nome de arquivo temporário; evita o esforço de pensar em um nome único garantido sempre:command filename > filename.$$ && mv filename.$$ filename
(Brincadeirinha, embora você provavelmente descubra que é a mais rápida de todas as soluções postadas aqui: -b).
O caminho canônico é:
No entanto, não é facilmente adaptável a seqüências arbitrárias. Por exemplo,
Só funciona se
$var
não contém,&
,\
,/
nem caracteres de nova linha.Nesse sentido,
ou
funcionaria melhor.
fonte
Apresento uma solução usando o
awk
prefixo "foo".awk
é multiplataforma e está disponível em qualquer sistema POSIX. Não realiza edição no local. Se você deseja editar um arquivo sem criar um segundo, precisará usar um arquivo temporário. Veja ased
resposta de Joseph , mostra a sintaxe. Outro truque é usar a seguinte sintaxe, que basicamente cria um arquivo temporário com o mesmo nome que o arquivo original.fonte
reducto# wc -l foo
914 foo`reducto# { rm foo ; awk '{ print "prepend" , $0 }' > foo } < foo
>
Isso parece não funcionar. Eu estava tentando, porque o redirecionamento para o original me deixou nervoso, mas nem sequer começou.Você pode evitar os problemas de edição no local com as ferramentas de fluxo usando uma ferramenta que normalmente faz a edição no local - um editor!
Há uma vantagem adicional de que os comandos são fáceis e óbvios para quem é versado no único editor verdadeiro.
fonte
Você pode usar
perl
para fazer isso:Exemplo
Crie um arquivo de amostra.
Execute o comando acima:
fonte
sed
, eu mostrei como usar Perl .... não procurando uma guerra santa sobre o assunto.Simplesmente usando o Bash
Usando Python
Se você deseja editar no local
Link de referência
fonte
awk
em arquivos muito pequenos. O comportamento varia nas implementações de eco e elimina os espaços em branco iniciais e finais e processa as barras invertidas especialmente.prefix () { while IFS= read -r REPLY; do printf "%s%s\n" "$1" "$REPLY"; done; }
deveria ser mais correto.{}
? Eu acho que o @Matt estava sugerindo que você transformasse em uma função nomeada, qual é o sentido de{}
sem um nome de função?Ou você pode fazer o seguinte:
Esc(para garantir que você esteja no
NORMAL
modo) e digite o seguinte comando:fonte
1,$
por simplesmente%
. Isso faz o comando:%s/^/string/
.