Ich lerne Shell-Scripting und benutze dafür den HackerRank. Es gibt eine Frage, die sich sed
auf die gleiche Site bezieht : 'Sed' Befehl # 1 :
Transformieren Sie für jede Zeile in einer bestimmten Eingabedatei das erste Vorkommen des Wortes 'the' mit 'this'. Bei der Suche und Transformation muss die Groß- und Kleinschreibung beachtet werden.
Zunächst habe ich versucht,
sed 's/the/this/'
aber in diesem Beispiel ist der Testfall fehlgeschlagen. Dann habe ich es versucht
sed 's/the /this /'
und es hat funktioniert. Es stellt sich also die Frage, welchen Unterschied die Leerzeichen gemacht haben. Vermisse ich hier etwas?
sed
whitespace
JHA
quelle
quelle
Antworten:
Der Unterschied besteht darin, ob
the
im Eingabetext ein Leerzeichen nach steht .Zum Beispiel:
Bei einem Satz ohne Leerzeichen kein Ersatz:
Funktioniert mit einem Satz mit einem Leerzeichen wie erwartet:
Bei einem Satz mit einem anderen Leerzeichen erfolgt keine Ersetzung:
quelle
the( |$)
könnte näher an der Arbeit sein, wenn das Extended Regex funktioniert. Wie auch immer, IDK was du meinst "als String" vs. Teilstring. In beiden Fällen handelt es sich um einen Teil der gesamten Zeile, und Ihre Testfälle reichen nicht aus, um die Fälle zu erkennen, in denen ein Fehler auftritt"the "
. Kusalanadas Antwort ist bedeutend besser. Ich würde empfehlen, sie zu akzeptieren.Dies ist eine kostengünstige und fehleranfällige Methode für die Worterkennung .
Beachten Sie, dass
the
ein Leerzeichen nach dem Wort nicht mit dem Wortthereby
übereinstimmt. Wenn Sie also ein Leerzeichen nach dem Wortthe
einfügen, wird vermieden, dass diese Zeichenfolge am Wortanfang übereinstimmt . Dies ist jedoch immer noch der Fall übereinbathe
(wenn ein Leerzeichen folgt), und es stimmt nichtthe
am Ende einer Zeile überein .Um eine
the
korrekte Übereinstimmung mit dem Wort (oder einem anderen Wort) zu erzielen, sollten Sie keine Leerzeichen um das Wort verwenden, da dies verhindern würde, dass das Wort am Anfang oder Ende von Zeilen übereinstimmt oder von einem anderen Nicht-Wort-Zeichen flankiert wird, z B. Interpunktions- oder Tabulatorzeichen.Verwenden Sie stattdessen ein Wortbegrenzungsmuster mit der Breite Null:
Das
\<
und\>
entspricht den Grenzen vor und nach dem Wort, dh dem Abstand zwischen einem Wortzeichen und a Nichtwortzeichen . Ein Wortzeichen ist im Allgemeinen ein beliebiges Zeichen[[:alnum:]_]
(oder[A-Za-z0-9_]
in der POSIX-Ländereinstellung) .Mit GNU
sed
können Sie auch\b
anstelle von\<
und Folgendes verwenden\>
:quelle
sed arbeitet mit regulären Ausdrücken. Verwenden
sed 's/the /this /'
Sie einfach das Leerzeichen nachthe
Teil des übereinstimmenden Musters.Mit
sed 's/the/this/'
ersetzen Sie alle Vorkommen vonthe
mitthis
unabhängig davon , ob ein Raum nach existiertthe
.In der HackerRank-Übung ist das Ergebnis dasselbe, weil es logisch ist, das durch das zu ersetzen ... Sie ersetzen nur ein Pro-Nomen, dem standardmäßig ein Leerzeichen folgt (Grammatikregeln).
Sie können den Unterschied erkennen, wenn Sie beispielsweise versuchen,
the
das Wort in Großbuchstaben zu schreibenthe theater
:quelle
g
nach dem Ersetzungstext ersetzen Sie nur das erste Vorkommen.