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

13

Je souhaite écrire un script shell par lequel je pourrais lire le fichier à partir de la commande et éditer le fichier sans intervention manuelle (basé sur la recherche d'un texte et son remplacement par un autre).

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

Rohit Bansal
la source

Réponses:

10

C'est là sedqu'intervient pour jouer. Une sedcommande a ce format:

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

Il utilise des expressions régulières, donc cela peut / sera un peu difficile. Quelques exemples de base tirés du 2ème lien ci-dessous:

# substitue (trouve et remplace) "foo" par "bar" sur chaque ligne
sed 's / foo / bar /' # ne remplace que la 1ère instance d'une ligne
sed 's / foo / bar / 4' # ne remplace que la 4e instance d'une ligne
sed 's / foo / bar / g' # remplace TOUTES les instances d'une ligne
sed / \ (. * \) foo \ (. * foo \) / \ 1bar \ 2 / '# remplacer l'avant-dernier cas
sed 's / \ (. * \) foo / \ 1bar /' # ne remplace que le dernier cas

# remplacez "foo" par "bar" UNIQUEMENT pour les lignes contenant "baz"
sed '/ baz / s / foo / bar / g'

# remplacer "foo" par "bar" SAUF pour les lignes qui contiennent "baz"
sed '/ baz /! s / foo / bar / g'

# changer "écarlate" ou "rubis" ou "puce" en "rouge"
sed 's / écarlate / rouge / g; s / rubis / rouge / g; s / puce / rouge / g' # la plupart des graines
gsed 's / scarlet \ | ruby ​​\ | puce / red / g' # GNU sed uniquement

Quelques références

Rinzwind
la source
7

Réponse très tardive. Cependant, cela pourrait aider d'autres personnes ayant un problème / 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 contient des 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 patch_file.sh.

Ligne de commande: ouvrez un terminal et copiez et exécutez les lignes ci-dessous (modifiez les noms de fichiers 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

Rendez 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
user3832905
la source
Le patch +1 est toujours la solution pour les modifications moyennes à lourdes ou complexes. Je ne sais pas pourquoi certains essaient de tout faire en utilisant des outils d'expression régulière.
user.dz
+1 tellement mieux que le reverse engineering d'un regex qui semble appliquer le changement que vous souhaitez sur le fichier avec lequel vous testez ... mais lorsqu'il est appliqué à d'autres instances de ce fichier a parfois d'autres effets.
bigjosh
Un patch a-t-il un sens si je veux remplacer toutes les instances de chaînes de texte spécifiques, c'est-à-dire remplacer tous les "" par "_", tous les "moins" par "-" et tous les "gb | <string_of_numbers> | ARO:" avec " ARO: "? Merci.
Josh
1

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, comme ex ou ed .

geirha
la source
1

Vous recherchez sed ou awk. Je trouve sed plus simple et awk plus puissant.

Voici un exemple d' une autre question .

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

Ça signifie:

  • rechercher dans le fichier /usr/share/applications/defaults.list
  • Rechercher / grep gedit.desktop
  • Remplacer par yournew.desktop
  • Appliquer les modifications en place -i
RobotHumains
la source
0

En fonction de ce que vous devez modifier, si vous connaissez vialors edpeut être utile.

glenn jackman
la source