Comment trouver et remplacer des mots spécifiques dans un fichier texte à l'aide de la ligne de commande?
command-line
text-processing
Jon Doe
la source
la source
Réponses:
Explication:
sed
= Éditeur de flux-i
= in-situ (c.-à-d. sauvegarder dans le fichier d'origine)La chaîne de commande:
s
= la commande de substitutionoriginal
= une expression régulière décrivant le mot à remplacer (ou simplement le mot lui-même)new
= le texte pour le remplacer parg
= global (c'est-à-dire remplacer tout et pas seulement la première occurrence)file.txt
= le nom du fichierla source
sed
seront identiques. Ajoutez un-r
indicateur si vous souhaitez utiliser des RE étendues./
caractère que vous devez rechercher, vous pouvez simplement utiliser un autre caractère comme séparateur (par exemple's_old/text_new/text_g'
). Sinon, vous pouvez mettre un\
avant n'importe lequel$ * . [ \ ^
pour obtenir le caractère littéral.sed -i '.bak' 's/original/new/g' file.txt
peut également être exécutée avec une extension de longueur nullesed -i '' 's/original/new/g' file.txt
, qui ne générera aucune sauvegarde.Il y a différentes façons de le faire. On utilise
sed
et Regex. SED est un éditeur de flux permettant de filtrer et de transformer du texte. Un exemple est le suivant:Une autre façon qui peut faire plus de sens que
< strin
et> strout
est avec des tuyaux!la source
cat
incat file | sed '...'
est inutile. Vous pouvez directement diresed '...' file
.sed -i'.bak' -e 's/unicorn/fox/g;s/hyper/brown/g' yarly
le fichier sera gravé dans les yeux et fera les 2 changements en place tout en faisant une sauvegarde. Utilisanttime bash -c "$COMMAND"
le temps, cela suggère que cette version est environ 5 fois plus rapide.Il y a une multitude de façons de le réaliser. En fonction de la complexité de l'objectif recherché avec le remplacement de chaîne et des outils connus de l'utilisateur, certaines méthodes peuvent être préférées à d'autres.
Dans cette réponse, j'utilise un
input.txt
fichier simple , que vous pouvez utiliser pour tester tous les exemples fournis ici. Le contenu du fichier:FRAPPER
Bash n'est pas vraiment destiné au traitement de texte, mais des substitutions simples peuvent être effectuées via le développement de paramètres . Nous pouvons notamment utiliser ici une structure simple
${parameter/old_string/new_string}
.Ce petit script ne fait pas de remplacement sur place, ce qui signifie que vous devez enregistrer le nouveau texte dans un nouveau fichier et vous en débarrasser, ou
mv new.txt old.txt
Note latérale: si vous êtes curieux de savoir pourquoi,
while IFS= read -r ; do ... done < input.txt
on utilise le shell pour lire le fichier ligne par ligne. Voir ceci pour référence.AWK
AWK, étant un utilitaire de traitement de texte, convient parfaitement à cette tâche. Il peut effectuer des remplacements simples et beaucoup plus avancés basés sur des expressions régulières . Il fournit deux fonctions:
sub()
etgsub()
. Le premier ne remplace que la première occurrence, tandis que le second - remplace les occurrences dans la chaîne entière. Par exemple, si nous avons une chaîneone potato two potato
, ce serait le résultat:AWK peut prendre un fichier d'entrée en argument, il
input.txt
serait donc facile de faire la même chose avec :Selon la version d'AWK que vous possédez, il est possible que l'édition in-situ ne soit pas activée. Par conséquent, la pratique habituelle consiste à enregistrer et remplacer le nouveau texte. Par exemple, quelque chose comme ceci:
SED
Sed est un éditeur de ligne. Il utilise également des expressions régulières, mais pour de simples substitutions, il suffit de faire:
Ce qui est bien avec cet outil, c'est qu'il dispose d'une édition sur place, que vous pouvez activer avec
-i
flag.Perl
Perl est un autre outil souvent utilisé pour le traitement de texte, mais il s’agit d’un langage généraliste utilisé dans les réseaux, l’administration système, les applications de bureau, etc. Il a emprunté beaucoup de concepts / fonctionnalités d'autres langages tels que C, sed, awk et autres. La substitution simple peut être faite comme suit:
Comme sed, perl a également 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 commevar="Hello World"
, vous pourriez fairevar.replace("Hello","Good Morning")
Un moyen simple de lire le fichier et de remplacer la chaîne est le suivant:
Cependant, avec Python, vous devez également générer le nouveau fichier, ce que vous pouvez également créer à partir du script lui-même. Par exemple, voici un exemple simple:
Ce script doit être appelé avec
input.txt
comme argument de ligne de commande. La commande exacte pour exécuter un script python avec un argument de ligne de commande seraitou
Bien sûr, assurez-vous qu'il se
./myscript.py
trouve dans votre répertoire de travail actuel et pour la première manière, assurez-vous qu'il est défini comme exécutable avecchmod +x ./myscript.py
Python peut aussi avoir des expressions régulières, en particulier le
re
module, qui a unere.sub()
fonction, qui peut être utilisé pour des remplacements plus avancés.la source
tr
commande sous unixtr
c'est un autre excellent outil, mais notez qu'il sert à remplacer des ensembles de caractères (par exempletr abc cde
, traduiraita
parc
,b
end
. C'est un peu différent de remplacer des mots entiers comme avecsed
oupython
Vous pouvez utiliser Vim en mode Ex:
%
sélectionner toutes les ligness
remplacerg
remplacer toutes les instances dans chaque lignex
écrire si des changements ont été faits (ils l'ont fait) et quitterla source
Grâce à la commande gsub de awk,
Exemple:
Dans l'exemple ci-dessus, tous les 1 sont remplacés par des 0 quelle que soit la colonne où ils se trouvent.
Si vous voulez remplacer une colonne en particulier, procédez comme suit:
Exemple:
Il remplace 1 par 0 sur la première colonne uniquement.
À travers Perl,
la source
inotifywait
soussh
env, et la communication des données au format CSV (car le format personnalisé est bogué). J'ai alors pensé qu'il n'y avait pas de moyen simple de gérer un document CSV dans des scripts shell ... Et je le veux très léger. J'ai donc lancé un script assez simple pour analyser et générer des rapports au format CSV. J'ai lu la spécification CSV et remarqué qu'elle est plus élaborée que prévu et que je prends en charge la valeur multiligne entre guillemets. Jesed
comptais sur la création de jetons, mais je me suis vite rendu compte que même lessed
appels multilignes pouvaient comporter jusqu'à deux lignes. Que se passe-t-il alors si l'une de mes valeurs CSV s'étend sur plus de deux lignes?sed
est le s tream ed Itor dans la mesure où vous pouvez utiliser|
(tuyau) pour envoyer des flux standard (STDIN et STDOUT spécifiquement) à traverssed
et de les modifier par programme à la volée, ce qui en fait un outil pratique dans la tradition de la philosophie Unix; mais peut aussi éditer directement des fichiers en utilisant le-i
paramètre mentionné ci-dessous.Considérez ce qui suit :
s/
est utilisé pour s ubstitute l'expression trouvéefew
avecasd
:/g
signifie "global", ce qui signifie le faire pour toute la ligne. Si vous laissez le champ/g
(avecs/few/asd/
, il doit toujours y avoir trois barres obliques quoi qu'il en soit) etfew
apparaisse deux fois sur la même ligne, seul le premierfew
est remplacé parasd
:Ceci est utile dans certaines circonstances, par exemple pour modifier des caractères spéciaux au début des lignes (par exemple, remplacer les symboles plus grands que certaines personnes utilisent pour citer les éléments précédents dans les fils de courrier électronique avec un onglet horizontal tout en laissant une inégalité algébrique citée plus tard dans la ligne. intacte), mais dans votre exemple où vous indiquez que n'importe où
few
se produit, il doit être remplacé, assurez-vous de l'avoir/g
.Les deux options suivantes (drapeaux) sont combinées en une seule
-ie
:-i
option est utilisée pour modifier i placer n sur le fichierhello.txt
.-e
option indique la commande e xpression / à exécuter, dans ce cass/
.Remarque: Il est important que vous utilisiez
-i -e
pour rechercher / remplacer. Si vous le faites-ie
, vous créez une sauvegarde de chaque fichier avec la lettre 'e' ajoutée.la source
Vous pouvez faire comme ça:
Exemples: pour remplacer toutes les occurrences [logdir ',' '] (sans []) par [logdir', os.getcwd ()] dans tous les fichiers résultant de la commande de localisation, faites:
ex1:
ex2:
où [tensorboard / program.py] est le fichier à rechercher
la source
logdir', ''
->/logdir', os.getcwd()
) rend cette réponse difficile à analyser. De plus, cela vaut la peine de préciser que votre réponse localise d’abord les fichiers à utiliser, car cela ne fait pas partie de la question.