J'ai des fichiers dans un répertoire qui ressemblent à:
aaa bbbbb cccc value1=sevens.eighteen.11234567890123456789value2=yyyy body body body body body body body body body aaa bbbbb cccc value1=xxxx
Comment remplacer tout ce qui se trouve entre "value1 =" et "value2 =" dans l'en-tête par une chaîne (sevens.eighteen. ci-dessous) et un nombre généré aléatoirement de longueur 20 (11234567890123456789 ci-dessous)?
ex: aaa bbbbb cccc value1 = sevens.eighteen.11234567890123456789 = yyyy
J'ai essayé des variantes de ce qui suit, mais je n'obtiens pas ce que je veux.
sed -i '1 s /^.* value = / yoursubstitution value = /; $ s /^.* value = / yoursubstitution value = / '
Voici les résultats que je souhaite voir dans tous les fichiers de ce répertoire:
aaa bbbbb cccc value1=xxxxxvalue2=yyyy body body body body body body body body body aaa bbbbb cccc value1=xxxx
3 Réponses :
Avec un seul fichier.
aaa bbbbb cccc value1=sevens.eighteen.39489360437938728734value2=yyyy body body body body body body body body body aaa bbbbb cccc value1=xxxx
Sortie:
# create a 20 digit random number with bash for ((i=0;i<20;i++)); do num="${num}${RANDOM: -1:1}"; done # replace string with GNU sed sed -E '1 s/(value1=).*(value2=.*)/\1sevens.eighteen.'"$num"'\2/' file
Comment puis-je appliquer cela à de nombreux fichiers et quelle partie de cela imprime le contenu?
Il existe différentes manières de créer un chiffre aléatoire:
RAND_NR = "$ (tr -cd" [: digit:] " dev / urandom | head -c 20)"
Ensuite, vous pouvez remplacer la valeur en utilisant sed
:
sed "s / value1 =. * value2 = / value1 = sevens.eighteen. $ {RAND_NR} value2 = / "fichier
Guillemets doubles dans sed
pour développer la variable RAND_NR.
La sortie: p >
aaa bbbbb cccc value1=sevens.eighteen.76744539817863807290value2=yyyy body body body body body body body body body aaa bbbbb cccc value1=xxxx
cela fonctionne, qu'est-ce qui rend le contenu du fichier imprimé, je dois le supprimer?
Option -i
pour mettre en place les modifications.
Avec GNU awk pour le 3ème argument à match () et -i inplace
pour l'édition "inplace", vous avez juste besoin de cette seule commande:
$ cat file aaa bbbbb cccc value1=xxxxxvalue2=yyyy body body body body body body body body body aaa bbbbb cccc value1=xxxx,value2=yyyy $ cat tst.awk BEGIN { srand(seed) } NR==1 { fmt() } NR > 1 { print prev } { prev = $0 } ENDFILE { fmt(); print } function fmt() { if ( match($0,/(.*value1=).*(value2=.*)/,a) ) { $0 = a[1] "sevens.eighteen." int(10000000000000000000 + rand()*90000000000000000000) a[2] } } $ awk -v seed="$RANDOM" -f tst.awk file aaa bbbbb cccc value1=sevens.eighteen.55152151176931606528value2=yyyy body body body body body body body body body aaa bbbbb cccc value1=sevens.eighteen.98796005800472494080value2=yyyy
Par exemple :
$ awk -v seed="$RANDOM" -f tst.awk file aaa bbbbb cccc value1=sevens.eighteen.77242153065798582272value2=yyyy body body body body body body body body body aaa bbbbb cccc value1=xxxx $ awk -v seed="$RANDOM" -f tst.awk file aaa bbbbb cccc value1=sevens.eighteen.59551444957943291904value2=yyyy body body body body body body body body body aaa bbbbb cccc value1=xxxx
Notez que ce qui précède ne fonctionnera que sur la première ligne de chaque fichier d'entrée, donc même si l'expression rationnelle correspondait sur une ligne différente, elle ne serait pas modifiée. p>
Je vois que vous avez posé une autre question identique autre que celle que vous voulez faire pour les première et dernière lignes. Déplacez simplement le code qui change $ 0 vers une fonction car vous devrez l'appeler deux fois maintenant et enregistrer / modifier la ligne précédente plutôt que la ligne actuelle afin d'avoir la dernière ligne sur laquelle travailler dans ENDFILE (également une extension GNU awk) :
$ cat tst.awk BEGIN { srand(seed) } (FNR==1) && match($0,/(.*value1=).*(value2=.*)/,a) { $0 = a[1] "sevens.eighteen." int(10000000000000000000 + rand()*90000000000000000000) a[2] } { print } $ awk -i inplace -v seed="$RANDOM" -f tst.awk *