Quelle est la manière la plus simple de rechercher et remplacer une chaîne d'entrée donnée, par exemple abc
, et de la remplacer par une autre chaîne, par exemple XYZ
dans un fichier /tmp/file.txt
?
J'écris une application et j'utilise IronPython pour exécuter des commandes via SSH - mais je ne connais pas bien Unix et je ne sais pas quoi chercher.
J'ai entendu dire que Bash, en plus d'être une interface de ligne de commande, peut être un langage de script très puissant. Donc, si cela est vrai, je suppose que vous pouvez effectuer des actions comme celles-ci.
Puis-je le faire avec bash, et quel est le script le plus simple (une ligne) pour atteindre mon objectif?
sed
:s/..../..../ - Substitute
et/g - Global
invalid command code C
erreur ... Pour les remplacements sur place, BSDsed
nécessite une extension de fichier après l'-i
indicateur car il enregistre un fichier de sauvegarde avec l'extension donnée. Par exemple:sed -i '.bak' 's/find/replace/' /file.txt
Vous pouvez ignorer la sauvegarde en utilisant une chaîne vide comme ceci:sed -i '' 's/find/replace/' /file.txt
s/abc/XYZ/gi
La manipulation de fichiers n'est pas normalement effectuée par Bash, mais par des programmes invoqués par Bash, par exemple:
Le
-i
drapeau lui dit de faire un remplacement sur place.Voir
man perlrun
pour plus de détails, y compris comment effectuer une sauvegarde du fichier d'origine.la source
perl -pi -e 's/chdir (?:\\/[\\w\\.\\-]+)+/chdir blah/g' text
, mais je reçois toujours une erreur avec Ne pas avoir d'espace entre le motif et le mot suivant est obsolète à la ligne -e 1. Inégalée (en regex; marquée par <- ICI en m / (chdir) () (<- ICI ?: \\ / at -e ligne 1.J'ai été surpris quand je suis tombé sur ça ...
Il y a une
replace
commande livrée avec le"mysql-server"
paquet, donc si vous l'avez installé, essayez-le:Voir
man replace
pour en savoir plus.la source
replace
est un outil indépendant utile et les gens de MySQL devraient le libérer séparément et en dépendre b)replace
nécessite un peu de MySQL o_O Quoi qu'il en soit, installer mysql-server pour obtenir le remplacement serait la mauvaise chose à faire :)mysql-server
installé de package. Comme l'a souligné @rayro, enreplace
fait partie.Il s'agit d'un ancien article, mais pour tous ceux qui souhaitent utiliser des variables comme @centurian a déclaré que les guillemets simples signifient que rien ne sera développé.
Un moyen simple pour obtenir des variables est de faire une concaténation de chaînes puisque cela se fait par juxtaposition dans bash, ce qui suit devrait fonctionner:
la source
Bash, comme d'autres shells, n'est qu'un outil pour coordonner d'autres commandes. En général, vous essayez d'utiliser des commandes UNIX standard, mais vous pouvez bien sûr utiliser Bash pour appeler n'importe quoi, y compris vos propres programmes compilés, d'autres scripts shell, des scripts Python et Perl, etc.
Dans ce cas, il existe deux façons de procéder.
Si vous voulez lire un fichier et l'écrire dans un autre fichier, en faisant une recherche / remplacement au fur et à mesure, utilisez sed:
Si vous souhaitez éditer le fichier sur place (comme si vous ouvriez le fichier dans un éditeur, le modifiiez, puis l'enregistriez), fournissez des instructions à l'éditeur de ligne 'ex'
Ex est comme vi sans le mode plein écran. Vous pouvez lui donner les mêmes commandes que vous le feriez à l'invite ':' de vi.
la source
J'ai trouvé ce fil entre autres et je suis d'accord qu'il contient les réponses les plus complètes donc j'ajoute le mien aussi:
sed
eted
sont si utiles ... à la main. Regardez ce code de @Johnny:Lorsque ma restriction est de l'utiliser dans un script shell, aucune variable ne peut être utilisée à la place de "abc" ou "XYZ". Le BashFAQ semble être d'accord avec ce que je comprends au moins. Donc, je ne peux pas utiliser:
Mais que pouvons-nous faire? Comme, @Johnny a dit utiliser un
while read...
mais, malheureusement, ce n'est pas la fin de l'histoire. Les éléments suivants ont bien fonctionné avec moi:Comme on peut voir si
nullglob
est défini alors, il se comporte étrangement quand il y a une chaîne contenant un*
comme dans:qui devient
il n'y a pas de support d'angle de fin et Apache2 ne peut même pas se charger.
Ce type d'analyse devrait être plus lent que la recherche et le remplacement en une seule fois, mais, comme vous l'avez déjà vu, il existe quatre variables pour quatre modèles de recherche différents fonctionnant sur un cycle d'analyse.
La solution la plus appropriée à laquelle je peux penser avec les hypothèses données du problème.
la source
sed -e "s/$x/$y/"
, et cela fonctionnera. Pas les guillemets doubles. Cela peut devenir très déroutant si les chaînes des variables elles-mêmes contiennent des caractères ayant une signification particulière. Par exemple, si x = "/" ou x = "\". Lorsque vous rencontrez ces problèmes, cela signifie probablement que vous devez cesser d'essayer d'utiliser le shell pour ce travail.Vous pouvez utiliser
sed
:Utilisez
-i
pour "ignorer la casse" si vous n'êtes pas sûr que le texte à trouver soitabc
ouABC
ouAbC
, etc.Vous pouvez utiliser
find
etsed
si vous ne connaissez pas votre nom de fichier:Recherchez et remplacez dans tous les fichiers Python:
la source
Vous pouvez également utiliser la
ed
commande pour effectuer une recherche dans le fichier et remplacer:Voir plus dans " Édition de fichiers via des scripts avec
ed
".la source
sed -i <pattern> <filename>
). Très agréable!Si le fichier sur lequel vous travaillez n'est pas si volumineux et que le stockage temporaire dans une variable ne pose aucun problème, vous pouvez utiliser la substitution de chaîne Bash sur l'ensemble du fichier à la fois - il n'est pas nécessaire de le parcourir ligne par ligne:
L'ensemble du contenu du fichier sera traité comme une longue chaîne, y compris les sauts de ligne.
XYZ peut être une variable par exemple
$replacement
, et un avantage de ne pas utiliser sed ici est que vous n'avez pas à vous soucier du fait que la chaîne de recherche ou de remplacement puisse contenir le caractère de délimitation du modèle sed (généralement, mais pas nécessairement, /). Un inconvénient n'est pas de pouvoir utiliser des expressions régulières ou l'une des opérations plus sophistiquées de sed.la source
Soyez prudent si vous remplacez les URL par le caractère "/".
Un exemple de comment le faire:
Extrait de: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html
la source
Essayez la commande shell suivante:
la source
sed
, utilisezsed -i''
plutôt.Pour modifier le texte du fichier de manière non interactive, vous avez besoin d'un éditeur de texte sur place tel que vim.
Voici un exemple simple comment l'utiliser à partir de la ligne de commande:
C'est équivalent à la réponse @slim de l' ancien éditeur qui est fondamentalement la même chose.
Voici quelques
ex
exemples pratiques.Remplacer le texte
foo
parbar
dans le fichier:Suppression des espaces de fin pour plusieurs fichiers:
Dépannage (lorsque le terminal est bloqué):
-V1
paramètre pour afficher les messages détaillés.-cwq!
.Voir également:
la source
-V1
, pour forcer la fermeture, utilisezwq!
.Vous pouvez également utiliser python dans le script bash. Je n'ai pas eu beaucoup de succès avec certaines des meilleures réponses ici, et j'ai trouvé que cela fonctionnait sans avoir besoin de boucles:
la source
Vous pouvez utiliser la commande rpl. Par exemple, vous souhaitez modifier le nom de domaine dans l'ensemble du projet php.
Ce n'est pas une cause claire, mais c'est très rapide et utile. :)
la source