web-dev-qa-db-ja.com

末尾の空白の有無にかかわらず、Wordの一致にはどのような違いがありますか?

私はシェルスクリプトを学習しており、そのためにHackerRankを使用しています。同じサイトのsedに関連する質問があります: 'Sed'コマンド#1

特定の入力ファイルの各行について、最初に出現する単語「the」を「this」に変換します。検索と変換では、大文字と小文字を厳密に区別する必要があります。

まず始めに、

sed 's/the/this/'

しかし、そのサンプルテストケースでは失敗しました。それから私は試しました

sed 's/the /this /'

そしてそれは働いた。では、空白はどのような違いを生んだのでしょうか?ここで何か不足していますか?

12
JHA

違いは、入力テキストのtheの後にスペースがあるかどうかです。
例えば:

スペースなしの文あり、置換なし:

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

スペースのある文で、期待どおりに動作します:

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

別の空白文字を含む文の場合、置換は行われません。

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

これは、安価でエラーが発生しやすい方法ですWordマッチング

theの後にスペースがあると[thereby]は単語と一致しないため、theの後にスペースがあると、単語の先頭でその文字列と一致しなくなります。ただし、それでもdoesbatheに一致し(その後にスペースが続く場合)、nottheに一致しますライン。

Word the(またはその他のWord)を適切に一致させるには、Wordの前後にスペースを使用しないでください。スペースを使用すると、行の先頭または末尾で、または他の非-句読点やタブ文字などの単語文字。

代わりに、ゼロ幅のWord境界パターンを使用します。

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

\<および\>は、Wordの前後の境界、つまりWord文字非Word文字の間のスペースに一致します。 Wordの文字は通常、[[:alnum:]_](または[A-Za-z0-9_](POSIXロケール)。

GNU sedを使用すると、\b 代わりに \<および\>

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

sedは正規表現で動作します。 sed 's/the /this /'を使用すると、一致したパターンのtheの後にスペースを入れるだけです。

sed 's/the/this/'を使用すると、theの後にスペースがあっても、thisをすべてtheに置き換えます。

HackerRankの演習では、結果を同じにします。これをに置き換えるのは論理的です...代名詞だけを置き換えます。代名詞は、デフォルトでスペースが続きます(文法規則)。

たとえば、Wordでtheを大文字にしようとすると、違いがわかります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.
7
George Vasiliou