J’ai écrit un script simple qui lit le contenu du fichier et incrémente un nombre à l’intérieur de ce fichier, puis je conserve le changement en utilisant awk, lorsque j’essaie de redirect la nouvelle chaîne en utilisant ‘>’ la chaîne entière est redirigée dans un. ligne et pas comme l’original était qui est 4 lignes.
#!/bin/bash -x # This script is for Incrementing build numbers path=/home/RND/abrodov file=tst.txt tst=`cat $path/$file` printf "this is the content of the file before incrementing: \n $tst" newexpr=`awk '/^Build Number/{$4=$4+1;}1' /home/RND/abrodov/tst.txt` printf "\n the new content \n $newexpr" echo $newexpr > $path/$file
Ceci est le fichier d’origine avant d’exécuter le script:
Major Release Number = 4 Minor Release Number = 1 Service Pack Release Number = 2 Build Number = 22
C’est le contenu après avoir utilisé le script:
Major Release Number = 4 Minor Release Number = 1 Service Pack Release Number = 2 Build Number = 23
J’essaie de comprendre comment je peux redirect le texte dans le format original qui est de 4 lignes.
Vous devez envelopper vos variables entre guillemets:
echo "$newexpr" > "$path/$file"
Les guillemets autour de $path/$file
ne sont pas réellement nécessaires dans ce cas, mais ils ne nuisent pas.
Plus généralement, vous devriez également utiliser $( )
plutôt que backticks:
newexpr=$(awk '/^Build Number/{$4=$4+1;}1' "$path/$file")
Si vous voulez changer le fichier “in-place”, vous n’avez pas besoin d’utiliser de variable. Vous pouvez utiliser un fichier temporaire comme celui-ci:
awk '/^Build Number/{$4=$4+1;}1' "$path/$file" > /tmp/file && mv /tmp/file "$path/$file"
Les guillemets doubles conservent le format d’origine des données. Voir cet exemple simple, qui utilise set -x
pour activer le mode de débogage. Les commandes exécutées par le shell sont affichées sur les lignes commençant par +
. En fait, je vois que vous utilisez déjà #!/bin/bash -x
. set -x
fait la même chose que ça. :
$ s="1 > 2" $ set -x $ echo $s + echo 1 2 1 2 $ echo "$s" + echo '1 2' 1 2
La chaîne d’origine contient une nouvelle ligne, mais lorsque vous l’ echo
sans guillemets, elle est interprétée comme deux arguments à echo
place d’un argument contenant une nouvelle ligne. Ceci s’appelle le fractionnement de champ . Vous pouvez en apprendre plus sur l’importance d’utiliser des guillemets en lisant cet article wiki .