シェルスクリプト sedコマンドメモ


環境

環境によってsedは挙動が変わるそうなので、環境を記しておきます。

$ sw_vers
ProductName:    macOS
ProductVersion: 11.2.3
BuildVersion:   20D91

Macのsedはバージョンを表示するオプションは存在してない模様。
shell - How can I check the version of sed in OS X? - Stack Overflow

-eオプション

-e command
    Append the editing commands specified by the command argument to the list of commands.

eオプションを使用することで、コマンドをどこに記載するか明確にsedに伝えることができる。
eオプションを使用しないと、第一引数、第二引数と意味が変わってきてしまうので、とりあえずつけて実行すればよい。

バックアップファイルを作らせない

-i extension
        Edit files in-place similarly to -I, but treat each file independently from other files.  In particular, line numbers in each file
        start at 1, the ``$'' address matches the last line of the current file, and address ranges are limited to the current file.  (See
        Sed Addresses.)  The net result is as though each file were edited by a separate sed instance.

上書きのオプションiはそのまま使うとバックアップファイルを作成するので空文字列を渡してバックアップファイルを作らせないようにします。

sed -i ''

sed -e '$s/abc/aaa/' <filename>

ファイルの最後の行のみ対象にする

ファイル内の指定の行数のみを変種するには、置換コマンドのsの前に数字をつけて上げればよい。

sed -e '1s/abc/aaa/' <filename>

範囲指定もできる

sed -e '41,50s/abc/aaa/' <filename>

$は最後を表すので、以下で実行できる。

sed -e '$s/abc/aaa/' <filename>

置換スクリプトの区切り文字はスラッシュ以外も使える

bad flag in substitute command: 's'

置換対象に区切り文字が入っているとエラーが出ます。
変数展開などを使用していて、バックスラッシュが使用できない場合、区切り文字をスラッシュ以外の記号を使うことができます

|や#などいろいろ使えます。

 sed -e "s|src =|src =$(TMP)|" <filename>

bashにおけるメタ文字

sedを使うためには、sedにテキストが渡される前に、bashがどのように文字を展開するのか知っておく必要があります。

bashではメタ文字を文字として使用するには、\をつけてエスケープします。
メタ文字を完全無効化したい場合は文字列を'...'で囲んで、'を\でエスケープします。

シングルクォーテーション

'のみがメタ文字

ダブルクオテーション

\, $, " のみがメタ文字