Mac/Linux シェルの sed コマンド

UB3/informatics/commands_mac/sed

このページの最終更新日: 2024/09/30

  1. 概要: sed の使い方
  2. sed のオプション
  3. sed による記号の置換

広告

概要: sed の使い方

sed は stream editor の略で、文字列の置換、削除、抽出などを行うコマンドである。非常に便利であるが、書き方が少し複雑なので、awk とともに「やや難しいコマンド」として認識している。

sed の基本的な使い方は、

sed 's/置換の対象とする文字列/置換後の文字列/g' ファイル名

である (1)。/ を 区切り文字 delimiter という。

しかし、このままでは ターミナル に置換した文字列が出力されるだけなので、このように使うことはあまりない。よくあるのは、次のように cat と繋げて、置換後にファイルとして出力する方法だ。

cat input.file | sed 's/abc/ABC/g' > output.file

# cat なしでこう書いても同じ
sed 's/abc/ABC/g' input.file > output.file

g はファイル内の文字列全てを置換するという意味 (2)。これで、input.file の中にある abc という文字が全て ABC に置換され、置換後の ABC を含むファイルの内容全体が output.file として出力されることになる。

この部分のパターンを表にしておく。

/g

“global” の g か。該当する文字列全てを置換。

何もなし

's/abc/def/' のようにすると、それぞれの行にある最初の abc のみ が def に置換される。def のあとに / がないと sed: 1: "s/abc/def": unterminated substitute in regular expression というエラーになる。

/1

上記の「何もなし」と同じ。該当する文字列の、それぞれの行の 1 個目のみが置換される。

/2

該当する文字列の、それぞれの行の最初の 2 個が置換される。


選択した文字列を消去したいときは、置換後の文字列に何も入れず (もちろんスペースも入れず) s/abc//g のようにする。

sed のオプション

-i

i オプションを使うと、対象ファイルを上書きする。つまり

sed -i 's/abc/ABC/g' input.file

で、input.file というファイル内の文字列が全て置換されることになる。個人的には、変換前のファイルを残しておいた方が安心なので、上記の cat からパイプする方法の方が好みである。

-i".org" とすることで、input のファイル名に .org がついたバックアップファイルが作られるらしい (2) が、これは自分では試したことはない。

また、-i をつけておきながら > で output file を指定する矛盾したコードを書いたときには、 invalid command code S というエラーが出た。

sed による記号の置換

sed の基本的使い方は以下であり、/ が置換対象や置換後の文字列を区切る記号として使われている。この場合、

cat input.file | sed 's/abc/ABC/g' > output.file

たとえばこの abc をスペースに置換したい場合、単に 's/abc/ /g' とするとエラーになる。スペースが意味を持つ記号であるためである。

この場合は、スペースを エスケープ するために \ を使って 's/abc/\ /g' と書く必要がある。\ の次にある文字は、記号としての意味を除かれ、単なる文字として認識される。いずれ、エスケープに関するページも作りたい。


広告

References

  1. 【Linuxコマンド】sedで文字列を置換する方法. Link: Last access 2021/01/05.
  2. sedで特殊な記号を置換・削除. Link: Last access 2021/01/05.

コメント欄

サーバー移転のため、コメント欄は一時閉鎖中です。サイドバーから「管理人への質問」へどうぞ。