私はシェルスクリプトを学習しており、そのためにHackerRankを使用しています。同じサイトのsed
に関連する質問があります: 'Sed'コマンド#1 :
特定の入力ファイルの各行について、最初に出現する単語「the」を「this」に変換します。検索と変換では、大文字と小文字を厳密に区別する必要があります。
まず始めに、
sed 's/the/this/'
しかし、そのサンプルテストケースでは失敗しました。それから私は試しました
sed 's/the /this /'
そしてそれは働いた。では、空白はどのような違いを生んだのでしょうか?ここで何か不足していますか?
違いは、入力テキストの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
これは、安価でエラーが発生しやすい方法ですWordマッチング。
the
の後にスペースがあると[thereby
]は単語と一致しないため、the
の後にスペースがあると、単語の先頭でその文字列と一致しなくなります。ただし、それでもdoesはbathe
に一致し(その後にスペースが続く場合)、notはthe
に一致しますライン。
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/'
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.