1
votes

Comment remplacer la valeur d'en-tête dans un fichier par une chaîne et un nombre généré aléatoirement?

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


0 commentaires

3 Réponses :


1
votes

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


1 commentaires

Comment puis-je appliquer cela à de nombreux fichiers et quelle partie de cela imprime le contenu?



1
votes

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


2 commentaires

cela fonctionne, qu'est-ce qui rend le contenu du fichier imprimé, je dois le supprimer?


Option -i pour mettre en place les modifications.



1
votes

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 *


0 commentaires