J'apprends awk
et j'aimerais savoir s'il existe une option pour écrire les modifications dans un fichier, similaire à l' sed
endroit où j'utiliserais l' -i
option pour enregistrer les modifications dans un fichier.
Je comprends que je pourrais utiliser la redirection pour écrire des modifications. Cependant, y a-t-il une option awk
pour le faire?
Réponses:
Dans la dernière version de GNU Awk (depuis la sortie de la version 4.1.0 ), il a l'option d' édition de fichier "inplace" :
Exemple d'utilisation:
Pour conserver la sauvegarde:
la source
inplace
est en fait une bibliothèque incluse avecgawk
selon la réponse de iiSeymour , il eninplace
est de même pour quelque chose qui peut être inclus en tant que fichierincludefile
.Sauf si vous avez GNU awk 4.1.0 ou version ultérieure ...
Vous n'aurez pas une telle option que l'option de sed,
-i
alors faites plutôt:Remarque: ce
-i
n'est pas magique, il crée également un fichier temporaire qui lesed
gère juste pour vous.À partir de GNU awk 4.1.0 ...
GNU awk
a ajouté cette fonctionnalité dans la version 4.1.0 (publiée le 10/05/2013) . Ce n'est pas aussi simple que de donner simplement l'-i
option décrite dans les notes publiées:Vous devez utiliser le
inplace.awk
fichier d'inclusion fourni pour appeler l'extension correctement comme suit:La variable
INPLACE_SUFFIX
peut être utilisée pour spécifier l'extension d'un fichier de sauvegarde:Je suis heureux de cette fonctionnalité a été ajoutée mais pour moi, la mise en œuvre est pas très awkish que le pouvoir vient de la concision de la langue et
-i inplace
est de 8 caractères trop long imo .Voici un lien vers le manuel du mot officiel.
la source
awk '{ gsub(/foo/, "bar" ) } ; { print $0 }' file > tmp.txt && mv -v tmp.txt file
:?awk '{print $0}' file | sponge file
utilisantsponge
demoreutils
.@sudo_O a la bonne réponse .
Cela ne peut pas fonctionner:
Le shell effectue les redirections avant de céder le contrôle à un processus ( redirections ). La
>
redirection tronquera le fichier à une taille nulle ( redirection de la sortie ). Par conséquent, au moment où un processus est lancé et souhaite lire le fichier, il n'y a pas de données à lire.la source
juste un petit hack qui fonctionne
la source
Une alternative consiste à utiliser
sponge
:Où vous remplacez
'{print $0}'
par votre script awk etyour_file
par le nom du fichier que vous souhaitez éditer sur place.sponge
absorbe entièrement l'entrée avant de l'enregistrer dans le fichier.la source
sponge
fait partie demoreutils
. Il ne sera donc pas présent par défaut dans la plupart des systèmes. Mais on dirait qu'au moinssponge
lui-même est assez portable et peut être exécuté presque partout.tee
-basée est qu'ellesponge
lit tout dans la RAM avant d'écrire, par conséquent, elle se fige sur les fichiers volumineux.le suivi ne fonctionnera pas
cela devrait fonctionner
la source
Si vous souhaitez une solution uniquement awk sans créer de fichier temporaire et utilisable avec la version! = (Gawk 4.1.0):
la source
Utilisation du tee
la
tee
commande a lieu et est exécutée une fois laawk
commande terminée en raison du|
.la source