2023年04月26日 更新

sedのcコマンドで、特定の文字列を含む行を別の文字列で置き換える

どうも、クラゲジュニアです。

ちょっと特殊な使い方ですが、Linuxコマンドsedを使って、特定の文字列を含む行を別の文字列で置き換える方法です。

対象ファイル

例えば、以下のコードがファイル名code.pyとして保存されていたとします。

#クラゲジュニアのカウントアップ

#
# ここら辺に複数コメントがあり、行数が増えるかもしれない
#

import time

COUNTER = 10 #カウンター定数

for i in range(COUNTER):
    print(i)
    time.sleep(1)

print('Done!')

やりたいこと

コードエディタなど使わずに、コマンド一発でCOUNTERの初期値を5に変更したいとします。現状は10が入っていますが、何の数値が入っているか知らなくても対応できるようにします。

コマンド

具体的には sed "/対象文字列/c 変換後文字列" ファイル名 でできます。

sed -i "/COUNTER =/c COUNTER = 5" code.py

オプション-iはファイルを上書きするという意味です。対象文字列をCOUNTERのみにしてしまうと、変更したくない箇所も書き換わってしまうためCOUNTER =にしています。

実行後のファイル

COUNTER = 10 #カウンター定数COUNTER = 5に書き換わっています。

#クラゲジュニアのカウントアップ

#
# ここら辺に複数コメントがあり、行数が増えるかもしれない
#

import time

COUNTER = 5

for i in range(COUNTER):
    print(i)
    time.sleep(1)

print('Done!')

ただし、他の行にもCOUNTER =があった場合などは、そちらも書き換えられてしまうので、注意が必要です。また、より正確に行うならば正規表現を使うことをお勧めします。

以上です。