Custom Search

JITAKU_SVR_Wiki



sed(streaming editor)

以下で紹介するものはファイルの置換方法。
例えば一つのファイルの中にある、"aaa"という文字列を削除したり、別な文字列に置き換えを行う時に使用。

また、複数のファイルの文字列を置換することも可能。
例えば~~.htmlというファイルの末尾に"aaa"を追加したい、という場合にも有効。

文字列の入っているファイル

# cat test

iii
aaa
ddd
lll
#1234
 1234
#kkk
aaabbbcccddd
o#o#o#
trusted_networks 127.0.0.1/32 192.168.0.0/24 172.16.0.0/16

先に書式・オプションの説明。
[書式]
sed [オプション] 置換条件 ファイル名

[オプション]

-e:文字列を置換し、標準出力させる(実際に処理を行う前の確認をしたい時などに)

-i:標準出力させずに直接ファイルを編集する(複数ファイルの置換などに)

例1)

# sed -e "s/aaa/bbb/g test
testファイルの中のaaaという文字列をbbbという文字列に置換し、標準出力させる

例2)

# sed -i "s/aaa/bbb/g test
testファイルの中のaaaという文字列をbbbという文字列に直接ファイルを置換する

例3)

# sed -e "s/aaa/bbb/g test > test1
testファイルの中のaaaという文字列をbbbという文字列に置換し、test1というファイルに書き出す

以下、紹介しているものは-eオプションが多いので、ファイルにリダイレクトさせたり、
オプションを-iに変更し、都合のよいものを考えること。



単純置換

aaaをbbbに置換

# sed -e "s/aaa/bbb/g" test

iii
bbb
ddd
lll
#1234
 1234
#kkk
bbbbbbcccddd
o#o#o#
trusted_networks 127.0.0.1/32 192.168.0.0/24 172.16.0.0/16

削除(無に置換)

bbbを削除

# sed -e "s/bbb//g" test

iii
aaa
ddd
lll
#1234
 1234
#kkk
aaacccddd
o#o#o#
trusted_networks 127.0.0.1/32 192.168.0.0/24 172.16.0.0/16

行の削除

aaaが含まれる行の削除

# sed '/aaa/d' test

iii
ddd
lll
#1234
 1234
#kkk
o#o#o#
trusted_networks 127.0.0.1/32 192.168.0.0/24 172.16.0.0/16

行頭の#を削除

#から始まる行の#を削除する。

# sed -e "s/^#//g" test

iii
aaa
ddd
lll
1234
 1234
aaabbbcccddd
kkk
o#o#o#
trusted_networks 127.0.0.1/32 192.168.0.0/24 172.16.0.0/16

特定の文字列から始まる行の末尾に文字列を追加する

o#o#o#から始まる行の末尾に「111.222.123.0/24」と「110.119.117.177/32」

# sed "s/^\(o#o#o#.*\)/\1 111.222.123.0\/24 110.119.117.177\/32/" test

iii
aaa
ddd
lll
#1234
 1234
aaabbbcccddd
#kkk
o#o#o# 111.222.123.0/24 110.119.117.177/32
trusted_networks 127.0.0.1/32 192.168.0.0/24 172.16.0.0/16

特定の文字列から始まる行の行頭に文字列を追加する

# sed "s/^\(^trust\)/# \1/g" test
「trust」から始まる文字列の行頭に「#」を追加する

iii
aaa
ddd
lll
#1234
 1234
aaabbbcccddd
#kkk
o#o#o#
# trusted_networks 127.0.0.1/32 192.168.0.0/24 172.16.0.0/16

文頭に文字列を追加

$ sed -e "s/^/aaa/" test

aaatest

複数ファイルを一斉に置換する

スクリプトが10個存在するとし、
a1.sh a2.sh a3.sh .... a10.sh

# cat a1.sh

#/bin/bash

echo "test a"
cp -p /usr/local/www/a.html /var/www/html/a.html

これを全ファイル置換する。
置換前

echo "test a"~

置換後

echo "`hostname`"~

# sed -i 's/test a/`hostname`/g' *.sh

# cat a1.sh

#!/bin/bash

echo "`hostname`"
cp -p /usr/local/www/a.html /var/www/html/a.html

上記の様に"test a"の置換が完了。

次に、
置換前

/usr/local/www/a.html

置換後

/var/www/html.bak/a.html

# sed -i 's/usr\/local\/www/var\/www\/html.bak/g' *.sh

#!/bin/bash

echo "`hostname`"
cp -p /var/www/html.bak/a.html /var/www/html/a.html

スラッシュはエスケープする必要があるので、\を入れること。
a.htmlは置換する必要がないので、変更なし。

特定の文字列行を置換する

目的
main.cfのmyhostname行のホスト名を置換したい
jitaku-svr.info → hogehoge.com

置換前

# grep ^myhostname main.cf
myhostname = jitaku-svr.info

実行

# sed -i "s/^myhostname.*/myhostname\ \=\ \hogehoge.com/g" main.cf

置換後
myhostname = hogehoge.com

補足
myhostnameはそのままで、後ろのホスト名だけ置換したかったが、あきらめてmyhostnameはそのまま置換後の文字列として使用。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-12-17 (木) 17:22:45 (707d)