
私はシェルスクリプトを学んでおり、これに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/'
項目を置き換えることができます。the
this
the
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.