Guides, HowTos and Tips for Technology Geeks - The Geek Stuff

Sasikala氏がThe Geek StuffにおいてUnix Sed Tutorial: Find and Replace Text Inside a File Using RegExのタイトルのもと、sedコマンドで置換を実施する場合の使い方とその例題をまとめている。sedはテキストファイルから特定の行を表示したり削除、または特定の文字列を置換する用途で用いられる。特に文字列の置換をおこなうためのツールとして活用されることが多い。

sedは便利なツールだが、置換の指定方法はマニュアルを読むだけではわかりにくいところがある。実例を通して身につける方法がわかりやすい。Unix Sed Tutorial: Find and Replace Text Inside a File Using RegExではいくつかの異なる例を挙げながら動作を紹介している。紹介されている利用例は次のとおり。

sed 's/Linux/Linux-Unix/'

各行の最初に現れる「Linux」を「Linux-Unix」へ置き換える。

sed 's/Linux/Linux-Unix/g'

その行におけるすべての「Linux」を「Linux-Unix」へ置き換える。置換指定の最後に追加された「g」の指定が、すべての一致するものに対して置換を実施せよ、という命令になる。

sed 's/Linux/Linux-Unix/2'

その行において2つ目に現れる「Linux」を「Linux-Unix」へ置き換える。置換指定の最後に追加された「2」の指定が、2つ目に一致するものに対して置換を実施せよ、という命令になる。

sed -n 's/Linux/Linux-Unix/gpw output'

その行におけるすべての「Linux」を「Linux-Unix」へ置き換える (g)。置き換えが実施された行は標準出力へ表示する (p)。さらに出力された結果を指定されたファイル(ここではoutputという名前のファイルが指定されている)へ書き込む (w)。この例では3つのフラグが指定されている。「g」は前述したようにすべての一致するものに適用するという命令で、「p」は変換が実施された行を標準出力へ出力する命令、「w」は指定されたファイルへ変換された行を書き込む命令。

sed '/\-/s/\-.*//g'

その行において「-」があるところから行末までを削除する。「.」は任意の1文字、「*」は1つ前の文字の0回以上の繰り返しを意味する。

sed 's/...$//'

その行において行末から3文字文を削除する。「$」が行末を表現する。

sed -e 's/#.*//'

その行において「#」から行末までを削除する。

sed -e 's/#.*//;/^$/d'

その行において「#」から行末までを削除し、さらにその行そのものを削除している。「s/#.*//」と「/^$/d」の2つの命令が「;」で区切られてひとつにまとめられている。「^」は行頭を意味する。「/^$/d」は空行 (/^$/)を削除(d)するという意味になる。

sed 's/.$//'

DOSファイルの改行形式「\r\n」から「\r」を削除して「\n」のみにし、Unixで使いやすいものに変換する。

sed -e 's///g'

HTMLタグに一致する単語を削除する。「[A-Za-z\/]」が大文字小文字すべてのアルファベットとスラッシュを意味している。「/」が区切り文字として使われているため「\/」のようにエスケープして使っている。「\/」のようにバックスラッシュを先に書くと、その次の文字は通常の文字として扱われるようになる。なお、Unix Sed Tutorial: Find and Replace Text Inside a File Using RegExに掲載されている例は「's/]*>//g'」となっているが、これでは置換できない。掲載段階で編集を誤ったものとみられる。

区切り文字にはスラッシュ「/」が使われているが、使う文字が決まっているわけではない。「s」のあとに記載された文字が区切り文字として使われるため、パスを置換するなど「/」が区切り文字としてわかりにくい場合には「s,パターン,置換する文字列,g」のように使うこともできる。上記の例であればたとえばsed -e 's|||g'のように表記できる。「/」が区切り文字ではなくなるため、エスケープする必要がなくなっている。