J'ai un fichier à un moment donné contient une ligne comme ce qui suit:Bash - comment remplacer une ligne commençant par un modèle avec plusieurs lignes définies dans une variable?
VIRTUAL_ENV="/afs/sern.ch/user/l/lronhubbard/virtual_environment"
Il est la seule ligne dans le fichier qui commence par VIRTUAL_ENV
. En utilisant un script, je veux remplacer cette ligne par les lignes suivantes:
directory_bin="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
directory_env="$(dirname "${directory_bin}")"
VIRTUAL_ENV="${directory_env}"
Comment cela a-t-il pu être fait?
Pour commencer, j'ai les lignes de remplacement stockées dans un document en ligne dans le script:
IFS= read -d '' text << "EOF"
directory_bin="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
directory_env="$(dirname "${directory_bin}")"
VIRTUAL_ENV="${directory_env}"
EOF
Ensuite, je peux remplacer la ligne dans le fichier avec autre chose (ici, xxx
) en utilisant sed
:
sed -i "s/^VIRTUAL_ENV.*/xxx/g" test.txt
maintenant, comment puis-je utiliser défini ici document à données variables ${text}
, avec toutes ses nouvelles lignes et ainsi de suite, au lieu de xxx
dans la commande sed
?
EDIT: Suite à la suggestion rslemos, je l'ai mis en œuvre le suivant à l'aide d'un fichier temporaire au lieu d'un document en:
#!/bin/bash
temporary_filename="$(tempfile)"
cat > "${temporary_filename}" << "EOF"
directory_bin="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
directory_env="$(dirname "${directory_bin}")"
VIRTUAL_ENV="${directory_env}"
EOF
sed -i "/^VIRTUAL_ENV.*/ {
r ${temporary_filename}
d
}" test.txt
rm "${temporary_filename}"
Je voudrais encore savoir comment utiliser un document ici directement de sorte que je n'utilise pas inutilement le disque dur.
Veuillez ne pas poster de réponse dans le cadre de la question. Si vous voulez ajouter votre propre réponse, postez-la en guise de réponse. – tripleee