Rechercher et remplacer du texte dans un fichier à l'aide de commandes

423

Comment trouver et remplacer des mots spécifiques dans un fichier texte en utilisant la ligne de commande?

    
posée Jon Doe 07.01.2011 - 05:10
la source

7 réponses

707
sed -i 's/original/new/g' file.txt

Explication:

  • sed = éditeur de flux
  • -i = in-place (c.-à-d. sauvegarder dans le fichier d'origine)
  • La chaîne de commande:

    • s = la commande de remplacement
    • original = une expression régulière décrivant le mot à remplacer (ou simplement le mot lui-même)
    • new = le texte pour le remplacer par
    • g = global (c'est-à-dire remplacer tout et pas seulement la première occurrence)
  • file.txt = le nom du fichier

réponse donnée cscarney 07.01.2011 - 05:23
la source
26

Il existe plusieurs façons de procéder. On utilise sed et Regex. SED est un éditeur de flux pour filtrer et transformer le texte. Un exemple est le suivant:

[email protected]: ~$ echo "The slow brown unicorn jumped over the hyper sleeping dog" > orly
[email protected]: ~$ sed s/slow/quick/ < orly > yarly
[email protected]: ~$ cat yarly
The quick brown unicorn jumped over the hyper sleeping dog

Une autre manière qui peut avoir plus de sens que < strin et > strout est avec les pipes!

[email protected]: ~$ cat yarly | sed s/unicorn/fox/ | sed s/hyper/lazy/ > nowai
[email protected]: ~$ cat nowai 
The quick brown fox jumped over the lazy sleeping dog
    
réponse donnée Marco Ceppi 07.01.2011 - 05:26
la source
15

Vous pouvez utiliser Vim en mode Ex:

ex -sc '%s/OLD/NEW/g|x' file
  1. % sélectionnez toutes les lignes

  2. s substitut

  3. g remplace toutes les instances de chaque ligne

  4. x écrivent si des modifications ont été apportées (elles existent) et quittent

réponse donnée Steven Penny 16.04.2016 - 20:36
la source
13

Grâce à la commande gsub de awk,

awk '{gsub(/pattern/,"replacement")}' file

Exemple:

awk '{gsub(/1/,"0");}' file

Dans l'exemple ci-dessus, tous les 1 sont remplacés par des 0 indépendamment de la colonne où ils se trouvent.

Si vous souhaitez effectuer un remplacement sur une colonne spécifique, faites comme ceci,

awk '{gsub(/pattern/,"replacement",column_number)}' file

Exemple:

awk '{gsub(/1/,"0",);}' file

Il remplace 1 par 0 sur la colonne 1 uniquement.

Par Perl,

$ echo 'foo' | perl -pe 's/foo/bar/g'
bar
    
réponse donnée Avinash Raj 02.07.2014 - 14:59
la source
11

Il existe une multitude de façons d’y parvenir. Selon la complexité de ce que l'on essaie d'obtenir avec le remplacement de chaîne, et selon les outils avec lesquels l'utilisateur est familier, certaines méthodes peuvent être préférées plus que d'autres.

Dans cette réponse, j'utilise le simple fichier input.txt , que vous pouvez utiliser pour tester tous les exemples fournis ici. Le contenu du fichier:

roses are red , violets are blue
This is an input.txt and this doesn't rhyme

BASH

Bash n'est pas vraiment destiné au traitement de texte, mais des substitutions simples peuvent être effectuées via l'extension des paramètres , en particulier ici nous pouvons utiliser une structure simple ${parameter/old_string/new_string} .

#!/bin/bash
while IFS= read -r line
do
    case "$line" in
       *blue*) printf "%s\n" "${line/blue/azure}" ;;
       *) printf "%s\n" "$line" ;;
    esac
done < input.txt

Ce petit script ne fait pas de remplacement sur place, ce qui signifie que vous devrez enregistrer le nouveau texte dans un nouveau fichier et supprimer l'ancien fichier, ou mv new.txt old.txt

Note secondaire: si vous êtes curieux de savoir pourquoi while IFS= read -r ; do ... done < input.txt est utilisé, c'est essentiellement la façon dont le shell lit le fichier ligne par ligne. Voir ceci pour référence.

AWK

AWK, étant un utilitaire de traitement de texte, convient parfaitement à une telle tâche. Il peut effectuer des remplacements simples et des fonctions beaucoup plus avancées basées sur les expressions régulières . Il offre deux fonctions: sub() et gsub() . Le premier ne remplace que la première occurrence, tandis que le second - remplace les occurrences dans une chaîne complète. Par exemple, si nous avons une chaîne one potato two potato , ce serait le résultat:

$ echo "one potato two potato" | awk '{gsub(/potato/,"banana")}1'
one banana two banana

$ echo "one potato two potato" | awk '{sub(/potato/,"banana")}1'                                      
one banana two potato 

AWK peut prendre un fichier d'entrée comme argument, donc faire la même chose avec input.txt serait facile:

awk '{sub(/blue/,"azure")}1' input.txt

Selon la version d’AWK dont vous disposez, il est possible qu’il dispose ou non d’une édition sur place, de sorte que la pratique habituelle est de sauvegarder et de remplacer le nouveau texte. Par exemple, quelque chose comme ceci:

awk '{sub(/blue/,"azure")}1' input.txt > temp.txt && mv temp.txt input.txt

SED

Sed est un éditeur de ligne. Il utilise également des expressions régulières, mais pour des substitutions simples, il suffit de faire:

sed 's/blue/azure/' input.txt

Ce qui est bien avec cet outil, c’est qu’il possède une édition sur place, que vous pouvez activer avec l’indicateur -i .

Perl

Perl est un autre outil souvent utilisé pour le traitement de texte, mais il s’agit d’un langage à usage général, utilisé dans les réseaux, l’administration système, les applications de bureau et bien d’autres endroits. Il a emprunté beaucoup de concepts / fonctionnalités à d'autres langages tels que C, sed, awk et autres. La substitution simple peut se faire en tant que telle:

perl -pe 's/blue/azure/' input.txt

Comme sed, perl a aussi le drapeau -i.

Python

Ce langage est très polyvalent et est également utilisé dans une grande variété d’applications. Il a beaucoup de fonctions pour travailler avec des chaînes, parmi lesquelles replace() , donc si vous avez une variable comme var="Hello World" , vous pourriez faire var.replace("Hello","Good Morning")

Un moyen simple de lire le fichier et de remplacer la chaîne qu'il contient serait le suivant:

python -c "import sys;lines=sys.stdin.read();print lines.replace('blue','azure')" < input.txt

Avec Python, cependant, vous devez également générer un nouveau fichier, ce que vous pouvez également faire depuis le script lui-même. Par exemple, voici un simple:

#!/usr/bin/env python
import sys
import os
import tempfile

tmp=tempfile.mkstemp()

with open(sys.argv[1]) as fd1, open(tmp[1],'w') as fd2:
    for line in fd1:
        line = line.replace('blue','azure')
        fd2.write(line)

os.rename(tmp[1],sys.argv[1])

Ce script doit être appelé avec input.txt comme argument de ligne de commande.

Python peut aussi avoir des expressions régulières, en particulier le module re , qui a la fonction re.sub() , qui peut être utilisé pour des remplacements plus avancés.

    
réponse donnée Sergiy Kolodyazhnyy 03.02.2017 - 08:49
la source
5

sed est le s tream > ed itor , dans la mesure où vous pouvez utiliser | (pipe) pour envoyer des flux standard (STDIN et STDOUT spécifiquement) via sed et les modifier par programmation. voler, ce qui en fait un outil pratique dans la tradition de philosophie Unix; mais vous pouvez également modifier directement les fichiers en utilisant le paramètre -i mentionné ci-dessous.
Considérez les éléments suivants :

sed -i -e 's/few/asd/g' hello.txt

s/ est utilisé pour s utiliser l'expression trouvée few avec asd :

  

Les rares, les braves.

     

La cendre, le courageux.

/g signifie "global", ce qui signifie que cela doit être fait pour toute la ligne. Si vous omettez /g (avec s/few/asd/ , il doit toujours y avoir trois barres obliques, peu importe) et few apparaît deux fois sur la même ligne, seul le premier few est remplacé par asd :

  

Les quelques hommes, les rares femmes, les braves.

     

Les hommes asd, les rares femmes, les braves.

Ceci est utile dans certaines circonstances, comme modifier des caractères spéciaux au début des lignes (par exemple, remplacer les symboles plus grands que ceux que certaines personnes utilisent pour citer le matériel précédent dans un fil de discussion avec une tabulation horizontale tout en laissant une inégalité algébrique plus tardive) dans la ligne intacte), mais dans votre exemple où vous spécifiez que n'importe où few se produit, il doit être remplacé, assurez-vous que vous avez ce /g .

Les deux options suivantes (drapeaux) sont combinées en un seul, -ie :

L'option

-i est utilisée pour modifier i n le fichier hello.txt .

L'option

-e indique la commande e xpression / à exécuter, dans ce cas s/ .

Remarque: Il est important que vous utilisiez -i -e pour rechercher / remplacer. Si vous faites -ie , vous créez une sauvegarde de chaque fichier avec la lettre 'e' ajoutée.

    
réponse donnée Chaminda Bandara 23.11.2017 - 10:00
la source
0

Vous pouvez faire comme ça:

locate <part of filaname to locate> | xargs sed -i -e "s/<Old text>,<new text>/g" 

Exemples: pour remplacer toutes les occurrences [logdir ',' '] (sans []) avec [logdir', os.getcwd ()] dans tous les fichiers résultant de la commande de localisation, faites:

locate tensorboard/program.py | xargs sed -i -e "s/logdir', ''/logdir', os.getcwd()/g"

où [tensorboard / program.py] est un fichier à rechercher

    
réponse donnée Nguyễn Tuấn Anh 24.07.2018 - 04:13
la source

Lire d'autres questions sur les étiquettes