1.sedとは
sedは”Stream EDitor”の略で、sedスクリプトコマンドファイル名で指定したファイルをコマンドに従って処理し、標準出力へ出力する。
2.動作環境
ここでの実行環境は次の通り。
・VirtualBox Ubuntu 16.04.7 LTS
・sedのバージョン
$ sed –version
sed (GNU sed) 4.2.2
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
:
3.sedの基本
3.1 sedの基本構文
(1)sedコマンドの書式
sed [オプション ・・・] ファイル名 [ファイル名2 ・・・]
sed [-v] [–version] [-h] [–help]
・sedの主なオプション
-e スクリプト 処理内容を指定
d 削除する
s 指定したパターンに対して置換を行う
g すべて置換する
w 編集結果を別ファイルに保存する
y 文字の置き換え・圧縮する
-f ファイル名
指定したスクリプトファイルからコマンドを読み込む
-V, –version
バージョン情報を表示
-h, –help
ヘルプ
-E,-r 拡張正規表現を使う
-i, 標準出力せずにファイルを上書き
3.2 sedコマンドの使い方
・テストで使うテキストデータ
data.txt
1,apple
2,orange
3,Grape
(1)置換
・”apple”と 最初にマッチした箇所 を”APPLE”に置換
$ sed -e “s/apple/APPLE/” data.txt
1,APPLE
2,orange
3,Grape
・置換した結果をパイプでファイルに出力
$ sed -e “s/apple/APPLE/” data.txt > data_new.txt
$ vi data_new.txt
1,APPLE
2,orange
3,Grape
※この場合は処理部分を”(ダブルクォーテーション)で囲まなくても同じ結果が得られるが、”s/apple/A P P L E/”などスペースを使うときは”(ダブルクォーテーション)で囲まないと正しく処理されない。
(2)削除
・3行目を削除する
$ sed -e 3d data.txt
1,apple
2,orange
(3)置換してファイル上書き
$ sed -i s/orange/ORANGE/ data.txt
$ vi data.txt
1,apple
2,ORANGE
3,Grape
3.3 スクリプトファイルから読む
sample2.sed
s/orange/ORANGE/
$ sed -f sample2.sed data.txt
1,apple
2,ORANGE
3,Grape
3.4 スクリプトとして実行する
(1)引数無し
test1.sh
#! /bin/bash
sed -f sample2.sed data.txt
スクリプトファイルの実行権限を設定する
$ chmod +x test2.sh
$ ./test1.sh
1,apple
2,ORANGE
3,Grape
(2)ファイルを引数にする
test2.sh
#! /bin/bash
FILE1=${1}
sed -f sample2.sed ${FILE1}
スクリプトファイルの実行権限を設定する
$ chmod +x test2.sh
$ ./test2.sh data.txt
1,apple
2,ORANGE
3,Grape
3.5 C言語のプログラムからスクリプトファイルを実行
(1)引数無し
・data.txt
1,apple
2,orange
3,Grape
・test1.sh
#! /bin/bash
sed -f sample2.sed data.txt
・sed_test1.c
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int ret=system("./test1.sh");
printf("system()戻り値:%d\n",ret);
return 0;
}
・sed_test1.cをコンパイルし、実行
Linux の system 関数はプログラムの起動に成功すると0を返し、失敗すると-1を返す。
$ gcc -o sed_test1 sed_test1.c
$ ./sed_test1
1,apple
2,ORANGE
3,Grape
system()戻り値:0
(2)ファイルを引数にする
sed_test2.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char s1[]="./test2.sh ";
strcat(s1,argv[1]); //文字列の結合
int ret=system(s1);
printf("system()戻り値:%d\n",ret);
printf("argv[1]:%s\n",argv[1]);
printf("s1:%s\n",s1);
return 0;
}
$ gcc -o sed_test2 sed_test2.c
$ ./sed_test2 ./data.txt
1,apple
2,ORANGE
3,Grape
system()戻り値:0
argv[1]:./data.txt
s1:./test2.sh ./data.txt
The end