Estou aprendendo awk
e gostaria de saber se existe uma opção para gravar alterações no arquivo, semelhante a sed
onde eu usaria a -i
opção para salvar modificações em um arquivo.
Entendo que eu poderia usar o redirecionamento para escrever alterações. No entanto, existe uma opção awk
para fazer isso?
Respostas:
No GNU Awk mais recente (desde a versão 4.1.0 ), ele tem a opção de edição "inplace" de arquivos :
Exemplo de uso:
Para manter o backup:
fonte
inplace
é, na verdade, uma biblioteca incluída degawk
acordo com a resposta do iiSeymour , entãoinplace
é algo que pode ser incluído como umincludefile
.A menos que você tenha o GNU awk 4.1.0 ou posterior ...
Você não terá essa opção como a opção sed,
-i
então faça:Nota: o
-i
não é mágico, ele também está criando um arquivo temporário,sed
apenas lida com você.A partir do GNU awk 4.1.0 ...
GNU awk
adicionou essa funcionalidade na versão 4.1.0 (lançada em 10/05/2013) . Não é tão direto como apenas dar a-i
opção conforme descrito nas notas liberadas:Você precisa usar o
inplace.awk
arquivo de inclusão incluído para chamar a extensão corretamente da seguinte maneira:A variável
INPLACE_SUFFIX
pode ser usada para especificar a extensão para um arquivo de backup:Estou feliz esse recurso foi adicionado, mas para mim, a implementação não é muito awkish como o poder vem da concisão da linguagem e
-i inplace
é de 8 caracteres muito longo imo .Aqui está um link para o manual da palavra oficial.
fonte
awk '{ gsub(/foo/, "bar" ) } ; { print $0 }' file > tmp.txt && mv -v tmp.txt file
:?awk '{print $0}' file | sponge file
usandosponge
frommoreutils
.@sudo_O tem a resposta certa .
Isso não pode funcionar:
O shell executa os redirecionamentos antes de transferir o controle para algum processo ( redirecionamentos ). O
>
redirecionamento truncará o arquivo para tamanho zero ( redirecionando a saída ). Portanto, quando algum processo é iniciado e deseja ler o arquivo, não há dados para ele ler.fonte
apenas um pequeno truque que funciona
fonte
Uma alternativa é usar
sponge
:Onde você substitui
'{print $0}'
pelo seu script awk eyour_file
pelo nome do arquivo que deseja editar no local.sponge
absorve inteiramente a entrada antes de salvá-la no arquivo.fonte
sponge
faz parte demoreutils
. Portanto, ele não estará presente por padrão na maioria dos sistemas. Mas parece que pelo menos emsponge
si é portátil o suficiente e pode ser executado em quase todos os lugares.tee
com a baseada em, é quesponge
ela lê tudo na RAM antes de escrever e, portanto, congela em arquivos grandes.seguir não vai funcionar
isso deve funcionar
fonte
Caso você queira uma solução awk-only sem criar um arquivo temporário e utilizável com a versão! = (Gawk 4.1.0):
fonte
Usando tee
o
tee
comando ocorre e é executado após a conclusão doawk
comando devido ao|
.fonte