sedについて
sedはStream EDitorの略でアドレス、コマンド、パターンスペース(一時的なバッファのようなもの)の概念で成り立っています。
sedの動き
1.指定したファイルの内容を1行読み込んでパターンスペースに格納
2.アドレスとマッチしたら、コマンドを実行
3.パターンスペースを表示
この1~3を繰り返してテキスト処理を実行します。
(なお、コマンドはパターンスペースのデータに対する処理です)
例 3行目を削除する処理
sed -e '3d' names.txt
(処理が一つしかない場合には、-eは省略可能)
この場合、パターンスペースの結果を標準出力に表示します。names.txtの内容自体を操作するわけではありません。処理の結果をファイルに反映させたい場合には、
sed -i -e '3d' names.txt
とすれば、names.txtの3行目を削除します。でも、もとデータがなくなってしまうのは心配ですよね。そんな時には、
sed -i.bak -e '3d' names.txt
とすれば、処理が反映されたファイル、names.txtに加えて、もとファイルnames.txt.bakが生成されます。
mv names.txt.bak names.txt
とすれば、データのリストアが完了です
コマンドをファイルから実行したい場合には
command.sedというファイルに’3d’を書き込みます。
それを
sed -f command.sed names.txt
とすれば、ファイルからコマンド実行できます。
アドレス
下記例だと数字部分のこと(数字以外の場合もある)です。下記でいうと3です。この数字で操作する行を指定します。
sed '3d' names.txt
コマンド
アルファベットの部分のことです。下記でいうとdです。このアルファベットで操作する内容を指定します。
sed '3d' names.txt
dは削除を実行するコマンドです。この場合、name.txtの3行目を削除します。
コマンド一覧
d: 削除 (delete)
p: 表示 (print)
q: 停止 (quit)
a: 追加 (append)
i : 挿入 insert
y: 置換
3行目を表示
sed '3p' names.txt
3行目だけ表示
sed -n '3p' names.txt
3行目まで表示(3行目まで表示して停止)
sed '3q' names.txt
1行目に--- start ---を挿入
sed '1i--- start ---' names.txt
追加
sed -e '1i--- start ---' -e '$a--- end ---' names.txt
sed -e '1i--- start ---' -e '$a--- end ---' --e '/^$/d' names.txt
文字置換
文字(1字)を置換します
tをTに置換
sed 'y/t/T/' names.txt
tをT、Oをoに置換(toをTOに置換ではないので注意)
sed 'y/to/TO/' names.txt
tをO、oをTに置換
sed 'y/to/OT/' names.txt
文字列置換
文字列を置換します
最初に出現したappleをAppleに置換
sed 's/apple/Apple/' items.txt
ファイル内のすべてのappleをAppleに置換
sed 's/apple/Apple/g' items.txt
2番目に出現したappleをAppleに置換
sed 's/apple/Apple/2' items.txt
ファイル内のすべてのapple(大文字小文字を区別しない iオプション)をAppleに置換
sed 's/apple/Ringo/ig' items.txt
正規表現を用いた場合
ファイル内のすべてのapple(大文字小文字を区別しない iオプション)をAppleに置換
sed 's/[aA]pple/Ringo/g' items.txt
&や\1,\2
検索結果と一致した部分をうしろで利用
下記の場合、数字の0~5に一致したものを【】つきで表示します
sed 's/[0-5]/【&】/' items.txt
()をつけた部分はうしろでその順番通りに\1, \2として利用できます
sed 's/([0-5]) (.*)/\2 【\1】/' items.txt
パターンスペースを利用した複数行にわたる処理
h:hold パターンスペースの値 → ホールドスペース
g: get ホールドスペースの値 → パターンスペース
x: ホールドスペースとパターンスペースの値を入れ替える
cssファイルのbackground:の値をcolorと同じものにする処理
color change
/color: / {
h
s/color: /background: /
x
}
/background: / {
g
}
main {
color: red;
font-weight: bold;
font-size: 14px;
background: green;
}
まず 1 行ずつ style.css から読み込んでいきます。
「#main {」を見ていって、ex2.sed 内のどちらのアドレスにも引っかからないので、これはスキップすれば OK ですね。
そのままパターンスペースの内容が表示されるというものになります。
2 行目に来ると「/color: /」のアドレスにマッチするので、「color: red;」がパターンスペースに入っているはずです。
作業領域であるパターンスペースが今「color: red;」の状態です。
この時点で h をすると、ホールドスペースにも「color: red;」がコピーされます。
その後に s でパターンスペースに対して置換が行われます。
パターンスペースにある「color: 」が「background: 」に置換されます。
s コマンドによる置換後に x で exchange されます。
x が実行されるので、「background: red;」がホールドスペースになって、「color: red;」がパターンスペースになります。
その後にパターンスペースを表示するので、「color: red;」が表示されます。
「font-weight: bold;」の行と「font-size: 14px;」の行はアドレスにマッチしないので飛ばされますね。
そして「background: green;」の行ですが、「/background: /」のアドレスにマッチするので、まずはパターンスペースに「background: green;」が入ってきますね。
次に g の時点で、パターンスペースに対してホールドスペースの中身をコピーしなさい、となっているので、パターンスペースは「background: red;」になりますね。
その後、パターンスペースの中身を表示するので、今度表示されるのは「background: green;」ではなくて「background: red;」になりますね。
最後の行はアドレスにマッチしないのでそのまま表示されるという意味になります。
こうして「color: red;」から取った値が「background: 」の値になっているという結果になります。