Quelle différence cela fait-il de faire correspondre un mot avec / sans un espace de fin?


12

J'apprends le shell-scripting et pour cela j'utilise HackerRank. Il y a une question liée au sedmê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?


Je suppose que la première version a également "fonctionné", mais pas comme prévu. Il aurait dû remplacer la première occurrence de la séquence de lettres "le", mais vous avez probablement regardé la première occurrence du mot "le".
Dubu

Eh bien, dans cette histoire, oui, dans la pratique, non.
Rolf

Réponses:


7

La différence est de savoir s'il y a un espace après thedans le texte d'entrée.
Par exemple:

Avec une phrase sans espace , pas de remplacement:

$ echo 'theman' | sed 's/the /this /'
theman

Avec une phrase avec un espace , fonctionne comme prévu:

$ echo 'the man' | sed 's/the /this /'
this man

Avec une phrase avec un autre caractère d'espacement , aucun remplacement ne se produira:

$ echo -e 'the\tman' | sed 's/the /this /'
the     man

J'ai manqué ça. J'ai dû prendre "le" comme une chaîne. Pas une sous-chaîne.
JHA

1
@JHA: Cela compte également à la fin d'une ligne. Par exemple, le mot "the" pourrait apparaître à la fin d'une ligne dans le cadre d'un fichier avec retour à la ligne, mais toujours au milieu d'un paragraphe et donc toujours un mot normal dans une phrase anglaise. 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.
Peter Cordes

20

C'est une façon bon marché et sujette aux erreurs de faire l' appariement de mots .

Notez thequ'avec un espace après cela ne correspond pas au mot thereby, donc la correspondance avec un espace après theévite de faire correspondre cette chaîne au début des mots. Cependant, il reste ne correspond bathe(si elle est suivie par un espace), et il ne pas correspondre theà la fin d'une ligne.

Pour faire correspondre thecorrectement 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:

sed 's/\<the\>/this/'

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 \>:

sed 's/\bthe\b/this/'

7

sed fonctionne avec des expressions régulières. En utilisant sed 's/the /this /'vous créez simplement l'espace après une thepartie du motif correspondant.

En utilisant sed 's/the/this/'vous remplacez toutes les occurrences de thepar, thispeu importe si un espace existe après the.

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 theen majuscule le mot the theater:

echo 'the theater' |sed 's/the /THE /g'
THE theater                              
#theater is ignored since the is not followed by space

echo 'the theater' |sed 's/the/THE/g'
THE THEater
#both the are capitalized.

Merci pour la réponse. Apprécié :)
JHA

"vous remplacez toutes les occurrences" Pour être clair: sans le gtexte après le remplacement, vous remplacez uniquement la première occurrence.
Dubu
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.