Uczę się skryptowania powłoki i do tego używam HackerRank. Na sed
tej 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?
sed
whitespace
WSiSW
źródło
źródło
Odpowiedzi:
Różnica polega na tym, czy
the
w tekście wejściowym jest spacja .Na przykład:
Z zdaniem bez spacji , bez zamiany:
Z zdaniem ze spacją działa zgodnie z oczekiwaniami:
W przypadku zdania z innym znakiem spacji nie nastąpi zamiana:
źródło
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ć.Jest to tani i podatny na błędy sposób dopasowywania słów .
Zauważ, że
the
spacja po nim nie pasuje do słowathereby
, więc dopasowanie ze spacją pothe
pozwala uniknąć dopasowania tego łańcucha na początku słów. Jednak to jeszcze nie pasujebathe
(jeśli następnie spacja), a to nie nie zgadzathe
się na końcu linii.Aby
the
poprawnie 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:
\<
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
sed
możesz również używać\b
zamiast\<
i\>
:źródło
sed działa z wyrażeniami regularnymi. Używając
sed 's/the /this /'
ciebie, po prostu zrób przestrzeń zathe
częścią dopasowanego wzoru.Korzystanie
sed 's/the/this/'
zastąpić wszystkie wystąpieniathe
zthis
Nieważne, czy istnieje przestrzeń pothe
.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
the
w słowiethe theater
:źródło
g
tekstu zastępującego zastępujesz tylko pierwsze wystąpienie.