Jaką różnicę ma dopasowanie słowa z / bez spacji końcowej?


12

Uczę się skryptowania powłoki i do tego używam HackerRank. Na sedtej samej stronie pojawia się pytanie : polecenie „Sed” nr 1 :

Dla każdego wiersza w danym pliku wejściowym przekształć pierwsze wystąpienie słowa „the” za pomocą „this”. Wyszukiwanie i transformacja powinny uwzględniać wielkość liter.

Po pierwsze próbowałem

sed 's/the/this/'

ale w tym przykładzie przypadek testowy nie powiódł się. Potem spróbowałem

sed 's/the /this /'

i zadziałało. Powstaje więc pytanie, jaką różnicę stworzyły białe znaki? Czy coś mi umyka?


Zakładam, że pierwsza wersja również „działała”, ale nie tak, jak się spodziewałeś. Powinien był zastąpić pierwsze wystąpienie sekwencji liter „the”, ale prawdopodobnie spojrzałeś na pierwsze wystąpienie słowa „the”.
Dubu,

Cóż, w teorii tak, w praktyce nie.
Rolf,

Odpowiedzi:


7

Różnica polega na tym, czy thew tekście wejściowym jest spacja .
Na przykład:

Z zdaniem bez spacji , bez zamiany:

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

Z zdaniem ze spacją działa zgodnie z oczekiwaniami:

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

W przypadku zdania z innym znakiem spacji nie nastąpi zamiana:

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

Tęsknie za tym. Musiałem wziąć „the” jako ciąg. Nie podciąg.
WSiSW

1
@JHA: Ma to również znaczenie na końcu linii. np. słowo „the” może pojawić się na końcu wiersza jako część pliku z zawijaniem wiersza, ale nadal może znajdować się w środku akapitu i tym samym być normalnym słowem w zdaniu angielskim. the( |$)może być bliżej do działania, jeśli ten rozszerzony regex działa. W każdym razie IDK, co masz na myśli jako „ciąg znaków”, a podciąg. W obu przypadkach jest to podciąg całej linii, a twoje skrzynki testowe są niewystarczające do wykrycia przypadków, w których "the "zawodzi. Odpowiedź Kusalanady jest znacznie lepsza, polecam ją zaakceptować.
Peter Cordes,

20

Jest to tani i podatny na błędy sposób dopasowywania słów .

Zauważ, że thespacja po nim nie pasuje do słowa thereby, więc dopasowanie ze spacją po thepozwala uniknąć dopasowania tego łańcucha na początku słów. Jednak to jeszcze nie pasuje bathe(jeśli następnie spacja), a to nie nie zgadza thesię na końcu linii.

Aby thepoprawnie dopasować słowo (lub dowolne inne słowo), nie należy używać spacji wokół słowa, ponieważ uniemożliwiłoby to dopasowanie go na początku lub na końcu wiersza lub jeśli jest flankowane przez dowolny inny znak niebędący słowem, taki jak na przykład dowolna interpunkcja lub znak tabulacji.

Zamiast tego użyj wzorca granicy słowa o zerowej szerokości:

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

\<I \>dopasowuje granice przed i po słowie, czyli przestrzeni między znakiem słowa i charakter non-word . Słowo jest ogólnie dowolnym dopasowanym znakiem [[:alnum:]_](lub [A-Za-z0-9_]w ustawieniach regionalnych POSIX).

Dzięki GNU sedmożesz również używać \bzamiast \<i \>:

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

7

sed działa z wyrażeniami regularnymi. Używając sed 's/the /this /'ciebie, po prostu zrób przestrzeń za theczęścią dopasowanego wzoru.

Korzystanie sed 's/the/this/'zastąpić wszystkie wystąpienia thez thisNieważne, czy istnieje przestrzeń po the.

W ćwiczeniu HackerRank wynik jest taki sam, ponieważ zamiana na to jest logiczne ... zastępujesz tylko rzeczownik, po którym domyślnie następuje spacja (reguły gramatyczne).

Możesz zobaczyć różnicę, jeśli spróbujesz na przykład użyć dużej litery thew słowie 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.

Dziękuję za Twoją odpowiedź. Doceniam :)
JHA

„zastępujesz wszystkie wystąpienia”. Żeby było jasne: bez gtekstu zastępującego zastępujesz tylko pierwsze wystąpienie.
Dubu,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.