La casse de la recherche & remplacer avec sed
Je suis en train d'utiliser SED pour extraire du texte à partir d'un fichier journal.
Je peux faire un rechercher-remplacer sans trop de difficultés:
sed 's/foo/bar/' mylog.txt
Cependant, je veux faire de la recherche insensible à la casse. De ce que j'ai googlé, il ressemble ajoutant i
à la fin de la commande devrait fonctionner:
sed 's/foo/bar/i' mylog.txt
Cependant, cela me donne un message d'erreur:
sed: 1: "s/foo/bar/i": bad flag in substitute command: 'i'
Ce qui ne va pas ici, et comment puis-je résoudre ce problème?
Je suis sur macOS, en cas de questions.
- Avez-vous essayé de capital "je"?
- Je l'ai fait, mais il ne fonctionne pas. Il est perplexe, me suffit que je poste un appel à l'aide sur DONC. 🙁
- Pouvez-vous essayer de mettre à jour votre copie de sed?
I
est une extension GNU qui peut ne pas être disponible avec votre copie de la sed. - J'ai installé gnu sed, et il fonctionne... mais il me semble que si j'ai besoin d'exécuter un autre programme entièrement, il pourrait aussi bien être de perl.
- MODIFIER: j'ai frappé à travers l'OS X de qualification, comme l'OP accepté une réponse qui ne fonctionne pas sur OS X. (Comme une autre réponse indiqué, sed sur OS X ne supporte pas la comparaison insensible à la casse, contrairement à la documentation d'Apple.)
- Merci pour ça; dans le cas où vous vient le sentiment que la documentation d'Apple promet quelque chose de la mise en œuvre ne délivre de ma réponse ci-dessous:
man sed
EST cohérente avec la mise en œuvre - aucune mention de la (et pas de soutien dans la pratique) comparaison insensible à la casse; si vous avez trouvé un morceau de documentation en prétendant le contraire, s'il vous plaît laissez-nous savoir. - oui, désolé, je corrige la position des mains. La documentation d'Apple ne fait aucune revendication de comparaison insensible à la casse pour le sed.
- FWIW, les versions GNU des outils dont la version BSD est livré avec OS X sont disponibles à partir de divers gestionnaires de paquets. J'ai de la suite complète d'utilitaires de texte installé via Homebrew avec un
g
préfixe, donc je peux l'utilisergsed
ougdate
quand j'ai besoin d'une fonctionnalité qui n'est pas trouvé dans la version stock. - Depuis la question, il est clair que c'est un BSD problème de mise en œuvre qui affecte directement macOS, je pense qu'il garantit unstriking la qualification. Une requête pour "macOS casse sed recherche" m'a conduit ici, ce qui m'amène à croire que c'est d'une importance particulière. Je vais débiffer, la communauté doit me juger.
Vous devez vous connecter pour publier un commentaire.
Pour être clair: Sur macOS - comme de Mojave (10.14) -
sed
- qui est le BSD mise en œuvre - ne supporte PAS la comparaison insensible à la casse - difficile à croire, mais vrai. Le auparavant accepté de répondre à, qui montre un GNUsed
commande, acquis ce statut en raison de laperl
solution à base d'mentionné dans les commentaires.À faire que Perl solution travailler avec caractères étrangers ainsi, via l'UTF-8, utilisez quelque chose comme:
-C
tourne sur le support UTF-8 pour les ruisseaux et les fichiers, en supposant que les paramètres régionaux en cours est UTF-8.-Mutf8
indique à Perl pour interpréter le code source en UTF-8 (dans ce cas, la chaîne de caractères passée à-pe
) - c'est la plus courte de l'équivalent de la plus prolixe-e 'use utf8;'.
Merci, Mark Reed(Notez que à l'aide de
awk
n'est pas une option, soit, commeawk
sur macOS (c'est à dire, BWK awk, une.k.un. BSD awk) semble ignorer complètement les paramètres régionaux à l'ensemble de sestolower()
ettoupper()
fonctions ignorer les caractères étrangers (etsub()
/gsub()
n'ont pas l'insensibilité à la casse des drapeaux pour commencer).)note de l'Éditeur: Cette solution ne fonctionne pas sous macOS (de la boîte), car il s'applique uniquement aux GNU
sed
, alors que macOS est livré avec BSDsed
.Capitaliser les "I".
I
suffixe n'est pas un portable utilisation desed
. POSIXsed
utilise seulement de Base des Expressions Régulières (BREs), qui sont étonnamment limitée. Ils n'ont même pas l'appui de la+
(vous devez utiliser\{1,\}
au lieu de cela), sans parler de correspondance insensible à la casse. Le seul portable façon de le faire avec sed est de vérifier pour quelque chose comme/[hH][eE][lL][lL][oO]/
, qui est souvent irréalisable./gI
autrement, il va juste faire fonctionner sur le premier match.Une autre façon de contourner pour
sed
sur Mac OS X pour installergsed
de MacPorts ou HomeBrew, puis de créer l'aliassed='gsed'
.brew install gnu-sed
, puis est allé à mon ~/.bash_profile et a ajouté de l'alias. Merci @davmatbrew install gnu-sed --with-default-names
- ce qui va remplacer la valeur par défautsed
.La sed FAQ adresses de la étroitement liée à la casse de recherche. Il souligne que de nombreuses versions de la sed soutien d'un drapeau et b) c'est difficile à faire dans sed, vous devriez plutôt utiliser awk ou Perl.
Mais de le faire dans POSIX sed, ils suggèrent trois options (adapté de substitution ici):
Convertir en majuscules et en magasin d'origine de ligne en tenir à l'espace; cela ne fonctionne pas pour les substitutions, même si, comme le contenu d'origine sera rétabli avant l'impression, il est seulement bon pour insérer ou ajouter des lignes d'après-match insensible.
Peut-être que les possibilités sont limitées à
FOO
,Foo
etfoo
. Ceux-ci peuvent être couverts parDe recherche pour toutes les correspondances possibles, on peut utiliser le support des expressions pour chaque caractère:
La version Mac de
sed
semble un peu limité. Une façon de contourner cela est d'utiliser un conteneur linux (via le menu fixe) qui ont une durée de version desed
:J'avais un besoin similaire, et est venu avec cette:
cette commande tout simplement de trouver tous les fichiers:
ce que d'exclure des this_shell.sh (dans le cas où vous mettre la commande dans un script appelé this_shell.sh), té de la sortie de la console pour voir ce qui s'est passé, et ensuite utiliser sed sur chaque nom de fichier trouvé pour remplacer le texte foo par bar:
J'ai choisi cette méthode, car je n'aimais pas avoir tous les horodateurs changé pour les fichiers non modifiés. l'alimentation de la commande grep permet uniquement les fichiers avec texte cible d'être regardé (et donc susceptibles d'accroître les performances /vitesse)
assurez-vous de sauvegarder vos fichiers & test avant de l'utiliser. Peut ne pas fonctionner dans certains environnements pour les fichiers contenant des espaces. (?)
Si vous faites de la correspondance de motif premier, par exemple,
alors vous voulez mettre la
I
après le modèle:Exemple:
retourne
willma
; sans laI
, elle retourne la chaîne intacte (Fred
).sed: 1: "/fred/Is//willma/g": invalid command code I
Capital
I
est une option qui est utile pour la recherche d'une chaîne de caractères indépendamment des cas de sensibilité.