Linuxコマンド辞典 sedコマンド(テキスト処理)
テキストデータを編集する「sed」コマンドの概要と使い方を記載しています。
RHEL Fedora CentOS Vine Deblan Ubuntu Plamo
参考サイト:Man page of INSTALL
概要・使用方法
テキストデータに対して行単位で編集操作を行います。標準入力や指定されたファイルを読み込み、テキストの変換などを行って、標準出力に出力します。viは、入力されたデータがそのまま出力されることから、ビジュアルエディタと呼ばれます。sedは入力されたデータを行単位で処理するため、ストリームエディタと呼ばれます。
コマンドは、処理する対象行の位置を示す「アドレス」を含めることができます。アドレスは行数を数値で示し、「$」で最終行などを指定できます。
主なアドレス
アドレス | 処理内容 |
---|---|
数 | 行番号 |
$ | 最終行 |
開始行~間隔 | 開始行から始めて間隔行おきを対象行とする。「11~3」とすると11を開始行とし、 3を間隔に14,17行と、3行おきにコマンド処理される |
/正規表現/ | 正規表現にマッチした行をコマンド処理する |
\C正規表現C | 正規表現にマッチした行をコマンド処理する。 「C」は任意の文字を使うことが可能 |
0、アドレス | 先頭からアドレス指定までマッチしていると見なしてコマンド処理する |
アドレス、+数 | アドレスでマッチした行の次から数で指定した行までをコマンド処理する |
コマンドは行の処理内容を指示します。対象の前の行や後ろの行への文字列追加や、ファイルの挿入、正規表現で文字列の置き換えなどを行います。アドレスとコマンドの間に「!」を挟むと、該当する行以外をコマンド処理対象にします。
書式
$sed [オプション] コマンド [ファイル名・・・]
オプション
-n –quiet、–silent | 自動出力しない |
-e コマンド –expression=コマンド | 実行するコマンドを追加する |
-i[拡張子] –in-place[=拡張子] | 元のファイルを書き換える(拡張子を指定するとバックアップを取る) |
-f スクリプトファイル –file=スクリプトファイル | サブコマンドが書かれたスクリプトファイルを指定する |
-i[拡張子] –i-place[=拡張子] | 対象ファイルを編集する。拡張子を指定するとそれを付加して、 バックアップファイルにする |
-r –regexp-extended | 拡張正規表現を利用する |
コマンド
= | 行番号を表示する |
a\テキスト | テキストを追加する。 ※シェルによっては「\\」のように、「\」でエスケープする必要がある |
i¥テキスト | テキストを挿入する。 ※シェルによっては「\\」のように、「\」でエスケープする必要がある |
q | sedを終了する |
r ファイル名 | ファイルを先頭に追加する |
d | マッチする行を削除する |
l 文字数 | 指定した文字数で改行する |
p | 行を出力する |
s/パターンA/パターンB/[g] | 正規表現にマッチした部分を「文字列」で置き換える。「s/HOGE/FUGA/g」のように、 行末にオプションをつけることができる。 「g」ならその行にマッチした部分を行末まで、数字を指定すればマッチした番号を 対象に、pならマッチした行だけ処理して出力する |
y | 文字単位で置換する |
マッチする行を削除する
dコマンドを使用して、指定したファイルの指定行を削除して別ファイルに保存する方法
$sed '開始行,終了行d' 対象ファイル名(ソース) > 出力ファイル名
実行結果
[sunarin@localhost work]$ cat hostlist1.txt
#IP管理表
hostA floorA 192.168.0.10
hostB floorB 192.168.0.11
hostC floorA 172.16.0.20
hostD floorB 172.16.0.21
hostE floorA 172.16.0.22
[sunarin@localhost work]$ sed '2,3d' hostlist1.txt >output.txt
[sunarin@localhost work]$ ls
Country.txt hostlist1.txt hostlist2.txt iplist.txt log output.txt sample.txt
[sunarin@localhost work]$ cat output.txt
#IP管理表
hostC floorA 172.16.0.20
hostD floorB 172.16.0.21
hostE floorA 172.16.0.22
[sunarin@localhost work]$
ファイル内のテキストを置換する
sコマンドは文字列パターンがマッチする箇所を置換します。文字列パターンは正規表現も使用することができます。sコマンドはシングルコーテーションで囲います。
また、元ファイルは更新されません。
$sed 's/置換対象パターン/置換文字列/' 対象ファイル名(ソース)
すべて置換されない場合は、gスィッチを追加します。
$sed 's/置換対象パターン/置換文字列/g' 対象ファイル名(ソース)
実行結果
floorAをfloorA-1に置換しています。
[sunarin@localhost work]$ sed 's/floorA/floorA-1/' hostlist1.txt
#IP管理表
hostA floorA-1 192.168.0.10
hostB floorB 192.168.0.11
hostC floorA-1 172.16.0.20
hostD floorB 172.16.0.21
hostE floorA-1 172.16.0.22
[sunarin@localhost work]$ cat hostlist1.txt
#IP管理表
hostA floorA 192.168.0.10
hostB floorB 192.168.0.11
hostC floorA 172.16.0.20
hostD floorB 172.16.0.21
hostE floorA 172.16.0.22
[sunarin@localhost work]$
ファイル内のテキストを置換する(元ファイルを更新)
sコマンドを使用した場合、元ファイルは更新されないので-iオプションを追加します。
$sed -i 's/置換対象パターン/置換文字列/' 対象ファイル名(ソース)
すべて置換されない場合は、gスィッチを追加します。
$sed -i 's/置換対象パターン/置換文字列/g' 対象ファイル名(ソース)
実行結果
floorAをfloorA-1に置換しています。
[sunarin@localhost work]$ cat hostlist1.txt
#IP管理表
hostA floorA 192.168.0.10
hostB floorB 192.168.0.11
hostC floorA 172.16.0.20
hostD floorB 172.16.0.21
hostE floorA 172.16.0.22
[sunarin@localhost work]$ sed -i 's/floorA/floorA-1/' hostlist1.txt
[sunarin@localhost work]$ cat hostlist1.txt
#IP管理表
hostA floorA-1 192.168.0.10
hostB floorB 192.168.0.11
hostC floorA-1 172.16.0.20
hostD floorB 172.16.0.21
hostE floorA-1 172.16.0.22
[sunarin@localhost work]$
指定行数の先頭にコメントアウト(#)を追加する方法
$sed -i '1,10s/^/# /' ファイル名
実行結果
8行目から9行目にかけて#を追加しています。
[sunarin@localhost work]$ cat -n sample.sh
1 #!/bin/sh
2 #
3 # スクリプトコメント
4 #
5
6 var=123
7
8 echo "test script1"
9 echo "test script2"
10 echo "test script3"
11 echo $var
12
[sunarin@localhost work]$ sed -i '8,9s/^/# /' sample.sh
[sunarin@localhost work]$ cat -n sample.sh
1 #!/bin/sh
2 #
3 # スクリプトコメント
4 #
5
6 var=123
7
8 # echo "test script1"
9 # echo "test script2"
10 echo "test script3"
11 echo $var
12
[sunarin@localhost work]$
ファイルを置き換えるときバックアップを作成する
-iオプションに拡張子を指定するとバックアップが作成します。
$sed -i.bak '1,10s/^/# /' ファイル名
実行結果
[sunarin@localhost work]$ cat -n sample.sh
1 #!/bin/sh
2 #
3 # スクリプトコメント
4 #
5
6 var=123
7
8 echo "test script1"
9 echo "test script2"
10 echo "test script3"
11 echo $var
12
[sunarin@localhost work]$ sed -i.bak '8,9s/^/# /' sample.sh
[sunarin@localhost work]$ ls -la
合計 36
drwxrwxr-x 3 sunarin sunarin 170 5月 1 12:16 .
drwx------. 16 sunarin sunarin 4096 5月 1 12:16 ..
-rw-rw-r-- 1 sunarin sunarin 51 4月 30 21:35 Country.txt
-rw-rw-r-- 1 sunarin sunarin 146 5月 1 12:02 hostlist1.txt
-rw-rw-r-- 1 sunarin sunarin 38 4月 30 16:16 hostlist2.txt
-rw-rw-r-- 1 sunarin sunarin 53 4月 30 21:18 iplist.txt
drwxrwxr-x 4 sunarin sunarin 38 5月 1 08:29 log
-rw-rw-r-- 1 sunarin sunarin 146 5月 1 11:54 output.txt
-rw-rw-r-- 1 sunarin sunarin 129 5月 1 12:16 sample.sh
-rw-rw-r-- 1 sunarin sunarin 125 5月 1 12:16 sample.sh.bak <バックアップが作成されます。
-rw-rw-r-- 1 sunarin sunarin 49 5月 1 08:05 sample.txt
[sunarin@localhost work]$
検索文字にマッチした箇所を置換文字に置き換える方法
yコマンドを使用して、「y/検索文字のリスト/置換文字のリスト/」のように指定し、検索文字にマッチした箇所を、置換文字の同じ位置の文字に置き換えます。
$echo password | sed 'y/ao/@0'
実行結果
passwordのaを@に、oを0(ゼロ)に置換しています。
[sunarin@localhost work]$ echo password | sed 'y/ao/@0/'
p@ssw0rd
開始行から検索文字にマッチするまで表示する
開始行からマッチするまでの行をpコマンドを使用して表示する。ここでは、passwdファイルにcatで行番号を付加して、sedで出力しています。
$cat -n /etc/passwd | sed -n 0,/sys/p
実行結果
[root@localhost ~]# cat -n /etc/passwd | sed -n 0,/sys/p
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
[root@localhost ~]#
指定した行以外を表示する
$cat -n /etc/passwd | sed -n 3,20\!p
実行結果
3~20行以外を出力します。
[root@localhost ~]# cat -n /etc/passwd | sed -n 3,20\!p
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
21 saslauth:x:995:76:Saslauthd user:/run/saslauthd:/sbin/nologin
22 abrt:x:173:173::/etc/abrt:/sbin/nologin
23 setroubleshoot:x:994:991::/var/lib/setroubleshoot:/sbin/nologin
24 rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
25 pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
26 radvd:x:75:75:radvd user:/:/sbin/nologin
27 chrony:x:993:988::/var/lib/chrony:/sbin/nologin
28 unbound:x:992:987:Unbound DNS resolver:/etc/unbound:/sbin/nologin
29 qemu:x:107:107:qemu user:/:/sbin/nologin
30 gluster:x:991:986:GlusterFS daemons:/run/gluster:/sbin/nologin
31 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
32 usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
33 geoclue:x:990:984:User for geoclue:/var/lib/geoclue:/sbin/nologin
34 gdm:x:42:42::/var/lib/gdm:/sbin/nologin
35 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
36 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
37 gnome-initial-setup:x:989:983::/run/gnome-initial-setup/:/sbin/nologin
38 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
39 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
40 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
41 ntp:x:38:38::/etc/ntp:/sbin/nologin
42 tcpdump:x:72:72::/:/sbin/nologin
43 sunarin:x:1000:1000:sunarin:/home/sunarin:/bin/bash
[root@localhost ~]#
sedのスクリプトを用意して処理をする
実行するためのスクリプトファイルを作成します。以下の例では、IPアドレスを置換するスクリプトになります。
{
s/172.16.0.21/172.16.0.50/g
s/172.16.0.22/172.16.0.51/g
p
}
sed -n -f スクリプトファイル 置換元ファイル
実行結果
[sunarin@localhost work]$ cat sed1.sh
{
s/172.16.0.21/172.16.0.50/g
s/172.16.0.22/172.16.0.51/g
p
}
[sunarin@localhost work]$ sed -n -f sed1.sh hostlist1.txt
#IP管理表
hostA floorA-1 192.168.0.10
hostB floorB 192.168.0.11
hostC floorA-1 172.16.0.20
hostD floorB 172.16.0.50
hostE floorA-1 172.16.0.51
[sunarin@localhost work]$
スクリプトファイルを用意しない場合
sed -e "{スクリプト;スクリプト;・・・}" 置換元ファイル
[sunarin@localhost work]$ sed -e "{s/172.16.0.21/172.16.0.50/g;s/172.16.0.22/172.16.0.51/g;}" hostlist1.txt
#IP管理表
hostA floorA-1 192.168.0.10
hostB floorB 192.168.0.11
hostC floorA-1 172.16.0.20
hostD floorB 172.16.0.50
hostE floorA-1 172.16.0.51
[sunarin@localhost work]$