J'apprends le shell-scripting et pour cela j'utilise HackerRank. Il y a une question liée au sed
même site: Commande 'Sed' # 1 :
Pour chaque ligne d'un fichier d'entrée donné, transformez la première occurrence du mot «le» par «ceci». La recherche et la transformation doivent être strictement sensibles à la casse.
Tout d'abord, j'ai essayé,
sed 's/the/this/'
mais dans cet exemple, le cas de test a échoué. Ensuite j'ai essayé
sed 's/the /this /'
et ça a marché. Alors, la question se pose quelle différence les espaces blancs ont-ils créé? Est-ce que j'ai râté quelque chose?
sed
whitespace
JAI
la source
la source
Réponses:
La différence est de savoir s'il y a un espace après
the
dans le texte d'entrée.Par exemple:
Avec une phrase sans espace , pas de remplacement:
Avec une phrase avec un espace , fonctionne comme prévu:
Avec une phrase avec un autre caractère d'espacement , aucun remplacement ne se produira:
la source
the( |$)
pourrait être plus proche de travailler, si cette regex étendue fonctionne. Quoi qu'il en soit, identifiez ce que vous entendez par "chaîne" par rapport à sous-chaîne. Dans les deux cas, c'est une sous-chaîne de toute la ligne et vos tests sont insuffisants pour détecter les cas d'"the "
échec. La réponse de Kusalanada est nettement meilleure, je recommanderais de l'accepter.C'est une façon bon marché et sujette aux erreurs de faire l' appariement de mots .
Notez
the
qu'avec un espace après cela ne correspond pas au motthereby
, donc la correspondance avec un espace aprèsthe
évite de faire correspondre cette chaîne au début des mots. Cependant, il reste ne correspondbathe
(si elle est suivie par un espace), et il ne pas correspondrethe
à la fin d'une ligne.Pour faire correspondre
the
correctement le mot (ou tout autre mot), vous ne devez pas utiliser d'espaces autour du mot, car cela vous empêcherait de le faire correspondre au début ou à la fin des lignes ou s'il est flanqué d'un autre caractère autre que le mot, tel que tout caractère de ponctuation ou tabulation, par exemple.Utilisez plutôt un modèle de limite de mot de largeur nulle:
Le
\<
et\>
correspond aux limites avant et après le mot, c'est-à-dire l'espace entre un caractère de mot et un caractère non-mot . Un caractère de mot est généralement n'importe quel caractère correspondant[[:alnum:]_]
(ou[A-Za-z0-9_]
dans les paramètres régionaux POSIX).Avec GNU
sed
, vous pouvez également utiliser\b
à la place\<
et\>
:la source
sed fonctionne avec des expressions régulières. En utilisant
sed 's/the /this /'
vous créez simplement l'espace après unethe
partie du motif correspondant.En utilisant
sed 's/the/this/'
vous remplacez toutes les occurrences dethe
par,this
peu importe si un espace existe aprèsthe
.Dans l'exercice HackerRank, le résultat est le même car remplacer le par c'est logique ... vous remplacez juste un pro-nom qui par défaut est suivi d'un espace (règles de grammaire).
Vous pouvez voir la différence si vous essayez par exemple de mettre
the
en majuscule le motthe theater
:la source
g
texte après le remplacement, vous remplacez uniquement la première occurrence.