web-dev-qa-db-fra.com

Comment éditer par programme un fichier en utilisant uniquement un terminal?

Je souhaite écrire un script Shell permettant de lire le fichier à partir d'une commande et de l'éditer sans intervention manuelle (en recherchant du texte et en le remplaçant par un autre).

Je n'ai besoin d'aucun éditeur de texte pour cela .... simplement pour effectuer une recherche de texte (comme avec grep), puis le remplacer par un autre texte et enregistrer les modifications ....

13
Rohit Bansal

C'est là que sed entre en jeu. Une commande sed a le format suivant:

[pattern1][,pattern2][!] command [args]

Il utilise des expressions rationnelles afin que cela puisse/soit un peu difficile. Quelques exemples de base tirés du 2ème lien ci-dessous:

 # remplace (recherche et remplace) "foo" par "bar" sur chaque ligne 
 sed's/foo/bar/'# remplace uniquement la 1ère instance d'une ligne 
 sed 's/foo/bar/4' # remplace uniquement la 4ème instance d'une ligne 
 sed's/foo/bar/g '# remplace TOUTES les instances d'une ligne 
 sed' s/\ ( . *\foo\(. * foo \)/\ 1bar\2/'# remplace le dernier cas avant 
 sed' s/\ (. * \) foo/\ 1bar/'# remplace uniquement le dernier cas 
 
 # remplace "foo" par "bar" UNIQUEMENT pour les lignes contenant "baz" 
 sed '/ baz/s/foo/bar/g' 
 
 # remplace "foo" par "bar" SAUF les lignes qui contiennent "baz" 
 sed '/baz/!s/foo/bar/g'
 
 # change "écarlate" ou "Ruby" ou "puce" en "rouge" 
 sed/s/écarlate/rouge/g; s/Ruby/rouge/g; s/puce/red/g '# la plupart des seds 
 gsed'/scarlet\| Ruby\| puce/red/g '# GNU sed only 

Quelques références

10
Rinzwind

Réponse très tardive. Cependant, cela pourrait aider les autres avec un problème/une question similaire.

Je recommanderais de créer et d'appliquer un patch. Un bel exemple peut être trouvé ici .

Par exemple, en supposant qu'un nouveau fichier.txt contienne les modifications que vous souhaitez appliquer à old.txt. Vous pouvez exécuter les commandes sur un terminal ou en créant et en exécutant un fichier patch_file.sh.

Ligne de commande: ouvrez un terminal, copiez et exécutez les lignes ci-dessous (modifiez les noms de fichier si nécessaire):

diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Script: en utilisant une approche de fichier .sh. Dans un terminal (clavier: ctrl + alt + t: gedit patch_file.sh

Copiez et collez les commandes qui iraient sur le terminal, dans le fichier .sh et sous l’en-tête, comme indiqué ci-dessous (gedit).

#!/bin/sh
diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Rendre le script exécutable (terminal):

chmod +x patch_file.sh

Exécutez le script (terminal):

./patch_file.sh # may require Sudo access depending on the directory affected
5
user3832905

Si vous souhaitez modifier un fichier, utilisez un éditeur de fichiers. Il existe des éditeurs de fichiers basés sur des commandes qui peuvent être utilisés à partir de scripts, tels que ex ou ed .

1
geirha

Vous cherchez sed ou awk. Je trouve que sed est plus simple et que awk est plus puissant.

Voici un exemple de autre question .

sed -i 's/gedit.desktop/yournew.desktop/g' /usr/share/applications/defaults.list

Ça signifie:

  • recherche dans le fichier /usr/share/applications/defaults.list
  • Find/grep gedit.desktop
  • Remplacer par yournew.desktop
  • Appliquer les modifications en place -i
1
RobotHumans

Selon ce que vous devez modifier, si vous connaissez viname__, alors edNAME _ peut être utile.

0
glenn jackman