Che differenza fa abbinare una parola con / senza uno spazio bianco finale?


12

Sto imparando lo shell-scripting e per questo sto usando HackerRank. C'è una domanda relativa allo sedstesso sito: comando 'Sed' n. 1 :

Per ogni riga in un dato file di input, trasforma la prima occorrenza della parola 'the' con 'this'. La ricerca e la trasformazione devono essere rigorosamente sensibili al maiuscolo / minuscolo.

Prima di tutto ho provato,

sed 's/the/this/'

ma in quel caso di test fallito. Poi ho provato

sed 's/the /this /'

e ha funzionato. Quindi, sorge la domanda che differenza hanno creato gli spazi bianchi? Mi sto perdendo qualcosa qui?


Presumo che anche la prima versione "abbia funzionato", ma non come previsto. Avrebbe dovuto sostituire la prima occorrenza della sequenza di lettere "il", ma probabilmente hai visto la prima occorrenza della parola "il".
Dubu

Bene, in questa teoria, sì, in pratica, no.
Rolf,

Risposte:


7

La differenza è se c'è uno spazio dopo thenel testo di input.
Per esempio:

Con una frase senza spazio , nessuna sostituzione:

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

Con una frase con uno spazio , funziona come previsto:

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

Con una frase con un altro carattere di spazio bianco , non si verificherà alcuna sostituzione:

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

Ho perso questo. Ho dovuto prendere "the" come stringa. Non una sottostringa.
JHA

1
@JHA: è importante anche alla fine di una riga. ad esempio, la parola "the" potrebbe apparire alla fine di una riga come parte di un file con il ritorno a capo, ma essere ancora nel mezzo di un paragrafo e quindi essere ancora una parola normale in una frase inglese. the( |$)potrebbe essere più vicino al lavoro, se quel regex esteso funziona. Ad ogni modo, IDK cosa intendi "come stringa" vs. sottostringa. In entrambi i casi è una sottostringa dell'intera linea e le tue prove non sono sufficienti a rilevare i casi in cui "the "fallisce. La risposta di Kusalanada è decisamente migliore, consiglierei di accettarla.
Peter Cordes,

20

È un modo economico e soggetto a errori di corrispondenza delle parole .

Nota che thecon uno spazio dopo non corrisponde alla parola thereby, quindi la corrispondenza con uno spazio dopo theevita di far corrispondere quella stringa all'inizio delle parole. Tuttavia, ancora non corrisponde bathe(se seguito da uno spazio), ed esso non corrisponde thealla fine di una linea.

Per abbinare thecorrettamente la parola (o qualsiasi altra parola), non dovresti usare spazi attorno alla parola, in quanto ciò ti impedirebbe di abbinarla all'inizio o alla fine delle linee o se è affiancata da qualsiasi altro carattere non-parola, come qualsiasi segno di punteggiatura o di tabulazione, ad esempio.

Utilizzare invece un modello di limite di parole di larghezza zero:

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

Il simbolo \<e \>corrisponde ai confini prima e dopo la parola, ovvero lo spazio tra un carattere di parola e un carattere non di parola . Un carattere di parola è generalmente qualsiasi corrispondenza di carattere [[:alnum:]_](o [A-Za-z0-9_]nella locale POSIX).

Con GNU sed, puoi anche usare \bal posto di \<e \>:

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

7

sed lavora con espressioni regolari. Usandoti sed 's/the /this /'basta creare lo spazio dopo theparte del modello abbinato.

Utilizzando sed 's/the/this/'sostituire tutte le occorrenze di thecon thisnon importa se uno spazio esiste dopo the.

Nell'esercizio di HackerRank, il risultato è lo stesso perché sostituirlo con questo è logico ... sostituisci solo un pro-sostantivo che di default è seguito dallo spazio (regole grammaticali).

Puoi vedere la differenza se provi ad esempio a scrivere in maiuscolo thenella parola 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.

Grazie per la risposta. Apprezzato :)
JHA

"sostituisci tutte le occorrenze" Per essere chiari: senza il gtesto di sostituzione dopo, sostituisci solo la prima occorrenza.
Dubu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.