私はLinuxに初めてアクセスし、最近コマンドラインの実験を始めました。ファイルを作成し、名前を「hi.txt」として指定することにしました。ファイルの内容は次のとおりです。
This is hi.txt.
hi
hi
hi
このコマンドを使用して、ドキュメントsed -i 's/hi/hotel/g' hi.txt
のすべての「hi」を「hotel」に変更しました。出力は次のとおりです。
Thotels is hotel.txt
hotel
hotel
hotel
ご覧のとおり、「hi」という単語「This」も変更されました。これが起こらないようにする方法はありますか?
答え1
このs///
コマンドは、「search」パラメーターが次のようになると予想します。正規表現。ほとんどのバージョンでは、単語が単語と一致するか、単語の端の境界で幅がゼロの一致をsed
サポートする必要があります。\b
この場合、「単語」は文字、数字、または下線()文字で定義されます_
。たとえば、文字列がc++
ファイルの独自の行にあると仮定すると、\b
次の場所で一致します。
- 直前
c
。 c
そして最初のものの間+
。- 最後のものの直後です
+
。
次のコマンドは目的の結果を提供します。
sed -i 's/\bhi\b/hotel/g' hi.txt
前に単語文字()があり、後に単語文字()があるため、単語はthis
一致しません。ただし、周囲のスペースとすべて単語以外の文字であるため、文字列はの2番目のインスタンスで一致します。h
t
i
s
This is hi.txt
hi
.
答え2
$ sed -e 's/\([^[:alnum:]_.-]\)hi\([^[:alnum:]_.-]\)/\1hotel\2/g' -e 's/^hi$/hotel/' <file
This is hi.txt.
hotel
hotel
hotel