sedでファイルの先頭or末尾に文字列を挿入する方法
この投稿はsedで下記の目的で使う方法のメモです。
用例
用例を見ていただければ大体何しているかわかると思います。
全用例の前提として、inという名前のファイルをカレントディレクトリに作ってあります。
その内容は下記とします。
foo
bar
ファイルの先頭に文字列を挿入する
下記がそのシェルコマンドです。
sed -e '1s|^|head-|g' in > out
結果、outの内容は、inの先頭に「head-」という文字列を挿入した内容になります。
下記がその内容です。
head-foo
bar
ファイルの末尾に文字列を追加する
下記がそのシェルコマンドです。
sed -e '$s|$|-tail|g' in > out
結果、outの内容は、inの末尾に「-tail」という文字列を追加した内容になります。
下記がその内容です。
foo
bar-tail
蛇足
オプションと引数の説明
投稿本文中でsedの-eオプションに与えている文字列について少し説明します。
文字列は、 sedコマンド|置換前文字|置換後文字 の順で並んでいます。
ここではsedコマンドは置換前文字を探す範囲を指定しています。
先頭に挿入する方法で書いた1s
というsedコマンドは、ファイルの一行目を範囲指定します。
末尾に挿入する方法で書いた$s
というsedコマンドは、ファイルの最終行を範囲指定します。
置換前文字の"^"と"$"ですが、これらは下記対象の正規表現です。
^ : 行頭
$ : 行末
本文中のsedコマンドでは、これらのsedコマンドと正規表現(置換前文字)を利用して、ファイル先頭・末尾を指し示して、置換を行っています。
蛇足のおまけ
ちなみに、置換後文字にも正規表現を含めることができます。
例えば、下記に示すようにファイル先頭行・末尾行を追加できます。
\n : 改行
ファイル先頭行を追加する
sed -e '1s|^|head-\n|g' in > out
head-
foo
bar
ファイル末尾行を追加する
sed -e '$s|$|\n-tail|g' in > out
foo
bar
-tail
*echo -tail>> in
と同じことをしています。
あとがき
まだsedを使い始めてから間もないです。
なるべく覚えやすい書き方を知りたいです。
この投稿の背景は、テキストエディタで開けない大容量のバイナリファイルの編集をする必要があったことです。
ファイル先頭と末尾に文字列を追加する必要がありました。
sedに興味があるので、sedを使おうと思いました。
sedは大容量のファイルの編集にも役立つと知りました。面白いです。
ただ、使い慣れていないので、sed実行後にちゃんと望み通りの文字を追加できたか確認したくなりました。
先頭と末尾への追記をそれぞれ確認するには、下記のようなコマンドが役に立ちました。
位置 | シェルコマンド | 出力文字列 |
---|---|---|
先頭 | head -c 5 out | head- |
末尾 | tail -c 5 out | -tail |
(先頭および末尾から5文字分の出力をしています)
スクリプトの区切り文字に|
を使った理由
通常、sedスクリプトの区切り文字には/
を使うことが多いと思います。
今回は、あえて|
を使ってみました。
理由は、もし、置換前文字や置換後文字がパス文字列等(e.g. /usr/bin
)を含むならば、区切り文字|
を使うことによってエスケープシーケンスを省略できるからです。
覚えたてなのでエスケープシーケンスが少ない方が、見た目的にとっつきやすく感じたり、考慮することが少ないと感じています。
区切り文字 | シェルコマンド |
---|---|
/ |
sed -e 's/\/bin/\/usr\/bin/g in > out |
| |
sed -e 's|/bin|/usr/bin|g' in > out |
区切り文字については次の記事を参考にしました : sed でエスケープ処理をしないでURLの置換を行う
次に読みたいもの
gnu公式サイトのsedコマンドマニュアル
gnu公式サイトのsedコマンド一覧
sedで使う正規表現の仕様(IEEEのもの)