Je dois remplacer un texte dans un fichier texte par un autre. D'habitude je ferais quelque chose comme
sed -i 's/text/replacement/g' path/to/the/file
Le problème est que les deux text
et replacement
sont des chaînes complexes contenant des tirets, des barres obliques, blackslashes, citations et ainsi de suite. Si j'échappe à tous les caractères nécessaires, text
la chose devient rapidement illisible. D'autre part, je n'ai pas besoin de la puissance des expressions régulières: je dois juste remplacer le texte littéralement.
Existe-t-il un moyen de substituer du texte sans utiliser d'expressions régulières avec une commande bash?
Il serait plutôt trivial d’écrire un script qui le fasse, mais j’imagine qu’il devrait déjà exister quelque chose.
bash
regex
sed
text-editing
Andrea
la source
la source
find and replace all
bash
toujours été livrés avec Microsoft Word? ;) Non je rigole. Cependant, l’opérateur peut souhaiter effectuer cette opération sur une machine distante ou pour un lot de fichiers.sed
, ce qui est probablement un effort futile compte tenu de tous les commutateurs et les différences de plate - forme.Réponses:
Lorsque vous n'avez pas besoin du pouvoir des expressions régulières, ne l'utilisez pas. C'est bon.
Mais, ce n'est pas vraiment une expression régulière .
sed 's|literal_pattern|replacement_string|g'
Donc, si
/
est votre problème, utilisez|
et vous n'avez pas besoin d'échapper à l'ancien.ps: à propos des commentaires, voir aussi cette réponse Stackoverflow sur Échap une chaîne pour un modèle de recherche sed .
Mise à jour: si vous utilisez Perl, essayez avec
\Q
et\E
comme ceci,perl -pe 's|\Qliteral_pattern\E|replacement_string|g'
RedGrittyBrick
a également suggéré une astuce similaire avec une syntaxe Perl plus forte dans un commentaire icila source
s|||
ets///
est que le caractère de séparation est différent et qu'un personnage n'a pas besoin de s'échapper. Vous pourriez également faires###
. Le vrai problème ici est que l'OP ne veut pas avoir à s'inquiéter d'échapper au contenu deliteral_pattern
(ce qui n'est pas du tout littéral et sera interprété comme une regex).1234.*aaa
avec votre solution il correspond beaucoup plus que prévu1234\.\*aaa
.C'est la seule solution 100% sûre ici, car:
sed
)}
(donc supérieur à une solution Perl soumise)ENV['FIND']
est utilisé, non$FIND
. Avec$FIND
ou votre texte inséré dans le code Ruby, vous risquez de rencontrer une erreur de syntaxe si votre chaîne contient un caractère non échappé'
.la source
export FIND='find this; export REPLACE='replace with this';
dans mon script bash pour queENV['FIND']
etENV['replace']
avoir les valeurs attendues. Je remplaçais de très longues chaînes cryptées dans un fichier. C'était juste le billet.La
replace
commande le fera.https://linux.die.net/man/1/replace
Changement de lieu:
Pour stdout:
Exemple:
La
replace
commande est fournie avec MySQL ou MariaDB.la source
Vous pouvez également utiliser le
\Q
mécanisme de perl pour " citer (désactiver) les métacaractères du modèle "la source
perl -pe 's(\Qyour */text/?goes"here")(replacement)' file
Découvrez mon script Perl. il fait exactement ce dont vous avez besoin sans utilisation implicite ou explicite d’expression régulière:
https://github.com/Samer-Al-iraqi/Linux-str_replace
très pratique non? J'ai dû apprendre à Perl pour le faire. parce que j'en ai vraiment besoin.
la source
Vous pouvez le faire en échappant à vos habitudes. Comme ça:
Les crédits pour ces solutions vont ici: https://stackoverflow.com/questions/407523/escape-a-string-for-a-sed-replace-pattern
Note1: cela ne fonctionne que pour les mots-clés non vides. Les mots clés vides ne sont pas acceptés par sed (
sed -e 's//replacement/'
).Note2: malheureusement, je ne connais pas d'outil populaire qui n'utiliserait PAS regexp-s pour résoudre le problème. Vous pouvez écrire un tel outil en Rust ou en C, mais ce n’est pas là par défaut.
la source
J'ai rassemblé quelques autres réponses et proposé ceci:
la source
\n
. Toute solution?Vous pouvez utiliser str_replace de php :
Remarque: vous devrez néanmoins échapper aux guillemets simples
'
et doubles"
.la source
Node.JS équivalent de @Nowaker:
la source
Heres un plus "presque" manière de travail.
Utilisez vi ou vim.
Créez un fichier texte avec votre substitution dedans:
puis exécutez vi ou vim depuis la ligne de commande:
:% sno est la commande vi pour rechercher et remplacer sans magie.
/ est mon séparateur choisi.
: x enregistre et quitte vi.
Vous devez éviter les barres obliques inverses '\' La barre oblique vers l'avant '/' peut être remplacée par exemple par un point d'interrogation '?' ou quelque chose d'autre qui ne fait pas partie de votre recherche ou remplace-string, pipe '|' n'a pas fonctionné pour moi tho.
ref: https://stackoverflow.com/questions/6254820/perform-a-non-regex-search-replace-in-vim https://vim.fandom.com/wiki/Search_without_need_to_escape_slash http://linuxcommand.org/ lc3_man_pages / vim1.html
la source