末尾の空白がある場合とない場合の単語一致の違いは何ですか?

末尾の空白がある場合とない場合の単語一致の違いは何ですか?

私はシェルスクリプトを学んでおり、これにHackerRankを使用しています。sed同じウェブサイトに関連する質問があります。「Sed」コマンド #1:

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

まず試してみましたが、

sed 's/the/this/'

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

sed 's/the /this /'

効果がありました。もしそうなら、問題はスペースがどのような違いを生み出すのかということです。ここで何か抜けましたか?

答え1

これは安価でエラーが発生しやすいアプローチです。単語の一致

末尾のスペースはthe単語と一致しないため、末尾のスペースとthereby一致するとthe単語の先頭の文字列と一致しません。しかしまだするbathe後ろにスペースがあれば一致し、いいえthe行の終わりと一致します。

単語the(または他の単語)を正しく一致させるには、単語の周りにスペースを使用しないでください。これにより、行の先頭または末尾で一致しない場合、または単語以外の文字が横にある場合は一致しなくなります。たとえば、句読点やタブ文字などです。

代わりに、幅0の単語境界モードを使用してください。

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

単語の前と後の境界、つまり単語の間のスペースを\<一致させます。\>単語文字そして単語以外の文字。単語文字は通常、一致する文字[[:alnum:]_](または[A-Za-z0-9_]POSIXロケール)です。

GNUの場合と代わりに、sed以下を使用することもできます。\b\<\>

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

答え2

違い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

答え3

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

次の空白の有無にかかわらず、すべてのsed 's/the/this/'項目を置き換えることができます。thethisthe

HackerRankの練習では、theをthisに置き換えることが論理的であるため、結果は同じです。基本的に空白が続く代名詞だけを変更することです(文法規則)。

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.

関連情報