末尾の空白がある場合とない場合の単語の一致にはどのような違いがありますか?


12

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

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

まず始めに、

sed 's/the/this/'

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

sed 's/the /this /'

そしてそれは働いた。それでは、空白がどのような違いを生み出したのかという疑問が生じますか?ここに何かが足りませんか?


最初のバージョンも「機能した」と思いますが、期待どおりではありません。文字列 "the"の最初の出現を置換する必要がありますが、おそらく単語 "the"の最初の出現を調べました。
ドゥブ

まあ、この理論では、はい、実際には、いいえ。
ロルフ

回答:


7

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

私は逃しました。「the」を文字列として受け取らなければなりませんでした。部分文字列ではありません。
JHA

1
@JHA:行末でも重要です。たとえば、「the」という単語は、行の折り返しを伴うファイルの一部として行の最後に表示される可能性がありますが、それでも段落の途中にあるため、英語の文の通常の単語のままです。 the( |$)その拡張正規表現が機能する場合、動作に近いかもしれません。とにかく、IDKは「文字列として」対サブストリングを意味します。どちらの場合も、行全体のサブストリングであり、テストケースでは、"the "失敗したケースを検出するには不十分です。クサラナダの答えはかなり良いです、私はそれを受け入れることをお勧めします。
ピーター

20

これは、単語マッチングを行うための安価でエラーが発生しやすい方法です。

the後にスペースがあるとword therebyに一致しないため、その後にスペースがあると一致すると、the単語の先頭でその文字列との一致が回避されます。しかし、それはまだない一致bathe(空白が続いている場合)、およびそれがないではない一致するthe行の末尾。

単語the(または他の単語)を適切に一致させるには、単語の前後にスペースを使用しないでください。行の先頭または末尾で一致したり、他の単語以外の文字が隣接している場合などたとえば、句読点またはタブ文字。

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

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

\<そして\>すなわちの間のスペース、単語の前後の境界に一致する単語文字非単語の文字。単語の文字は、通常[[:alnum:]_](または[A-Za-z0-9_]POSIXロケールで)一致する文字です。

GNU sedでは、andの\b代わりに使用することもできます。\<\>

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

7

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

使用してsed 's/the/this/'あなたがの出現をすべて置き換えるthethisスペースが後に存在するかどうかに関係なくthe

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

たとえば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.

答えてくれてありがとう。感謝:)
JHA

「すべての出現箇所を置き換えます」明確にするために:g置換後のテキストなしでは、最初の出現箇所のみを置き換えます。
ドゥブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.