はじめに
sedコマンドの最低限覚えていれば現場で使える知識を簡単にまとめました。
sedコマンドとは
ファイルやコマンドの標準出力の文字列を置換することができるコマンドです。
基本構文
$ sed -e s/置換対象文字列/置換後文字列/g 対象ファイル
この場合、sedは対象ファイルにあるすべての「置換対象文字列」を「置換後文字列」に置換して、標準出力します。出力した内容を保存したいときはリダイレクトで別名のファイルに書き出すか -i オプションで対象ファイルを上書きします。
置換対象文字列には正規表現が使えます。凝った正規表現を使いたい場合は -r オプションをつけると使うことができます。
解説
-e オプション
–e スクリプト でsedのスクリプトを実行するというオプションになります。今回の場合は、s/置換対象文字列/置換後文字列/g がスクリプトになります。
このスクリプト部分でどのような動作をするかを記述します。
s/
s で1行ずつ取り出して正規表現で置換処理を行うというモードになります。
/ (スラッシュ)はスクリプト部分で使用する区切り文字のことです。スラッシュである必要はなく、: (コロン)や , (カンマ)などでも動作します。例えば、置換対象の文字列に / があるような場合に、以下のようにスラッシュをコロンに変えて実行することができます。
$ sed -e s:置換対象文字列:置換後文字列:フラグ 対象ファイル
g
この部分は置換処理の動作を変えるオプション的なフラグというものです。
sedは対象ファイルから1行ずつ取り出して置換処理を行う動作をしています。g フラグを指定しないと行ごとの最初に出てくる「置換対象文字列」しか置換してくれません。g フラグをつけることで、その行に出てくるすべての対象を置換するので、結果としてファイル全体の置換を行うことになります。
実践例
ここからは実際の使用例を紹介します。
以下の中身のファイル(test.csv)に対してコマンドを実行します。
id,date,str
1,2020-10-29,AAA
2,2020-10-30,BBB
3,2020-10-31,CCC
ファイル全体の2020という文字列を2021に置換して標準出力する
$ sed -e s/2020/2021/g test.csv
id,date,str
1,2021-10-29,AAA
2,2021-10-30,BBB
3,2021-10-31,CCC
置換してファイルに書き出す
$ sed -e s/2020/2021/g test.csv > test-sed.csv
この場合、同名ファイルにリダイレクトで書き出し(上書き)することはできません。リダイレクトを行うときはまずリダイレクト先ファイルの中身が空の状態にされてからsedが実行される動きになるため、置換しようとしていたファイルが空になるだけになります。
上書きしたい場合は、以下の例の通り -i オプションをつければOKです。(Macは動作が異なるので注意)
$ sed -i -e s/2020/2021/g test.csv
置換対象の範囲指定(1から3行目)をして置換する
範囲指定してその中だけ置換したい場面もあるかと思います。s の前に 開始行,終了行 とすることで対応できます。
$ sed -i -e 1,3s/2020/2021/g test.csv
id,date,str
1,2021-10-29,AAA
2,2021-10-30,BBB
3,2020-10-31,CCC
カレントディレクトリにある.csvファイルすべてを置換して上書きする(応用)
今まで例にあげたtest.csvのようなファイルが多数あって、そのすべての1行目のstrをstringに変えたい!みたいな場合はどうしますか?
応用的ですが、今までの知識と他のコマンドとの組み合わせで対応できます!
$ for list in $(ls -1 ./*.csv); do sed -i -e 1,1s/str/string/g $list; done
コメント