Utiliser grep et sed pour remplacer une chaîne par une autre

Je voudrais remplacer une chaîne d’un fichier par une chaîne d’un autre fichier. Bien que je ne sois pas expérimenté avec ces commandes, je m’attends à une combinaison de grep et sed le ferait mieux.

Ce qui rend cela un peu plus compliqué, c’est que je ne sais pas quelle chaîne est (j’essaie d’automatiser le remplacement du numéro de version sur ma documentation). Je sais que dans les deux cas, la chaîne que je cherche (disons “2.3.4”) est précédée de “version:”

Alors, puis-je dire “rechercher mot (ou rest de ligne ou tout ce qui est possible) après” version: “(appelons-le ssortingng1) et faire la même chose dans un autre fichier (donnant ssortingng2) et remplacer ssortingng ssortingng1 par ssortingng2.

Voici quelques exemples de fichiers texte:

fichier1.txt

Ceci est un fichier contenant
le numéro de version mis à jour.
version: 2.3.4
voici une chaîne avec plus d’infos

fichier2.txt

Ceci est un fichier de configuration
Il pourrait contenir un ancien numéro de version
version: 2.3.2
S’il vous plaît mettre à jour cette

Donc, la sortie attendue pour fichier2.txt deviendrait:

fichier2.txt

Ceci est un fichier de configuration
Il pourrait contenir un ancien numéro de version
version: 2.3.4
S’il vous plaît mettre à jour cette

Merci

Si vous avez un sed qui supporte l’option -i ,

 sed -i 's/version: .*/version: 1.2.3/' file1 file2 file3 ... 

Vous voudrez peut-être modifier le caractère générique regex; .* correspond à la fin de la ligne, tandis que [.0-9]* correspond à la plus longue séquence possible de points et de chiffres. Vous voudrez peut-être également autoriser des variations dans les espaces blancs environnants … Mais puisque c’est probablement l’une des 10% les plus fréquentes de ce site, cherchez des questions similaires à ce stade.

Pour obtenir la chaîne de remplacement de fichier1 et l’appliquer à fichier2, fichier3, etc., quelque chose comme

 new=$(sed -n 's/version: //p' file1) # Use double quotes, not single, in order to expand $new sed -i "s/version: [.0-9]*/version: $new/" file2 file3 ... 

La première invocation sed imprimera uniquement les lignes sur lesquelles “version:” a été trouvée et supprimée (remplacée par une chaîne vide). Vraisemblablement, il n’y aura qu’une seule ligne dans le fichier. Placez le résultat sur head -n 1 ou uniq ou quelque chose, ou trouvez / créez un script sed plus élaboré.

Vous utilisez normalement des guillemets simples autour des chaînes littérales, mais comme vous ne voulez pas de littéral $new dans le remplacement, nous utilisons des guillemets, qui permettent au shell d’effectuer un remplacement de variable (et plusieurs autres substitutions ne sont pas utilisées). ici) dans la chaîne citée.

c’est bon pour toi?

 kent$ head f1 f2 ==> f1 <== This is a file containing the updated version number. version: 2.3.4 here is a string with more info ==> f2 <== This is a configuration file It could contain an old version number version: 2.3.2 Please update this kent$ awk 'NR==FNR{if($0~/^version:/){x=$0;} next;}{gsub(/^version:.*$/,x);print $0}' f1 f2 This is a configuration file It could contain an old version number version: 2.3.4 Please update this