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¥テキストテキストを挿入する。
※シェルによっては「\\」のように、「\」でエスケープする必要がある
qsedを終了する
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]$