sedコマンドと拡張正規表現


表記が一定でない語句をまとめて置換したい

※「シス環系女子 season2 第7話」の備忘録です。

正規表現

パターン指定で検索や置換に便利。

  • 基本正規表現
  • 拡張正規表現
  • Perl互換正規表現

などがある。

vimによる拡張正規表現

以下のように拡張正規表現を使える。

:%s/\v検索するパターン/置換後の文字列/

具体例

:%s/\v(未着手|進行中|保留)/完了/

sedによる拡張正規表現

以下のように拡張正規表現を使える。

以下、テストデータ。

$ cat test_for_sed.log 
1,Windows XP SP3,2021-04-01,故障中
2,Windows XP SP3,2021-04-02,出荷中
3,Windows XP SP3,2021-04-03,故障中
4,mac OS,2021-04-03,故障中
5,Windows XP SP3,2021-04-04,出荷中
6,Windows XP SP3,2021-04-05,故障中

これの「Windows」で、かつ「故障中」のものだけを修理中にするsedコマンドと拡張正規表現を考える。
答えは以下の通り。

cat test_for_sed.log | sed -E -e "s/(Windows .+)故障中/\1修理中/"
1,Windows XP SP3,2021-04-01,修理中
2,Windows XP SP3,2021-04-02,出荷中
3,Windows XP SP3,2021-04-03,修理中
4,mac OS,2021-04-03,故障中
5,Windows XP SP3,2021-04-04,出荷中
6,Windows XP SP3,2021-04-05,修理中

各オプションの意味

-E: OS XやBSDで拡張正規表現を使う場合のオプション。(※Linux用のGNUの場合は「-r」を使う。)
(): 後方参照で使う文字列。
\1: 後方参照の文字列が入る箇所。2つ目、3つ目の文字列はそれぞれ「\2」「\3」となる。
.+: 「.」は任意の1文字。「+」は前の文字の1回以上の繰り返しを示す。よって「.+」は任意の文字列の1回以上の繰り返し。