Linux sed コマンド
Linux sed コマンドはスクリプトを使用してテキストファイルを処理します。
sed はスクリプトの指示に従ってテキストファイルを処理・編集できます。
Sed は主に、1つまたは複数のファイルを自動編集し、ファイルに対する反復操作を簡素化し、変換プログラムを作成するために使用されます。
構文
sed [-hnV][-e<script>][-f<script文件>][文本文件]
パラメータの説明:
- -e<script>または--expression=<script> オプションで指定したスクリプトで入力テキストファイルを処理します。
- -f<scriptファイル>または--file=<scriptファイル> オプションで指定したスクリプトファイルで入力テキストファイルを処理します。
- -hまたは--help ヘルプを表示します。
- -nまたは--quietまたは--silent script処理後の結果のみを表示します。
- -Vまたは--version バージョン情報を表示します。
動作の説明:
- a :追加。a の後ろには文字列を指定でき、その文字列は新しい行(現在の次の行)に表示されます。
- c :置換。c の後ろには文字列を指定でき、その文字列で n1,n2 の間の行を置き換えることができます!
- d :削除。削除なので、d の後ろには通常何も指定しません。
- i :挿入。i の後ろには文字列を指定でき、その文字列は新しい行(現在の前の行)に表示されます。
- p :出力。選択したデータを表示します。通常 p はパラメータ sed -n と一緒に使用します。
- s :置換。直接置換の作業を行うことができます!通常この s のアクションは正規表現と組み合わせることができます!例えば 1,20s/old/new/g のようにします!
例
まず、testfileファイルを作成します。内容は以下の通りです:
$ cat testfile #查看testfile 中的内容 HELLO LINUX! Linux is a free unix-type opterating system. This is a linux testfile! Linux test Google Taobao サンプル Tesetfile Wiki
にtestfileファイルの4行目の後に1行追加し、結果を標準出力に出力します。コマンドラインプロンプトで次のコマンドを入力します:
sed -e 4a\newLine testfile
実行したsedコマンドの後、出力結果は以下の通りです:
$ sed -e 4a\newLine testfile HELLO LINUX! Linux is a free unix-type opterating system. This is a linux testfile! Linux test newLine Google Taobao サンプル Tesetfile Wiki
行単位での追加/削除
将 testfileの内容をリスト表示して行番号を出力し、同時に2〜5行目を削除してください!
$ nl testfile | sed '2,5d'
1 HELLO LINUX!
6 Taobao
7 サンプル
8 Tesetfile
9 Wiki
sed のアクションは2,5d、そのdは削除の意味です。2〜5行目を削除したため、表示されるデータには2〜5行目がありません。また、本来は sed -e を実行すべきですが、-e がなくても問題ありません。さらに、sed の後ろに続くアクションは必ず'...'2つのシングルクォートで囲んでください!
2行目だけを削除する場合:
$ nl testfile | sed '2d'
1 HELLO LINUX!
3 This is a linux testfile!
4 Linux test
5 Google
6 Taobao
7 サンプル
8 Tesetfile
9 Wiki
3行目から最後の行までを削除する場合:
$ nl testfile | sed '3,$d'
1 HELLO LINUX!
2 Linux is a free unix-type opterating system.
2行目の後(つまり3行目として)にdrink tea?という文字列を追加します:
$ nl testfile | sed '2a drink tea'
1 HELLO LINUX!
2 Linux is a free unix-type opterating system.
drink tea
3 This is a linux testfile!
4 Linux test
5 Google
6 Taobao
7 サンプル
8 Tesetfile
9 Wiki
2行目の前に追加する場合は、コマンドは以下の通りです:
$ nl testfile | sed '2i drink tea'
1 HELLO LINUX!
drink tea
2 Linux is a free unix-type opterating system.
3 This is a linux testfile!
4 Linux test
5 Google
6 Taobao
7 サンプル
8 Tesetfile
9 Wiki
2行以上追加する場合は、2行目の後ろに2行分の文字列を追加します。例えばDrink tea or .....とdrink beer?
$ nl testfile | sed '2a Drink tea or ......\
drink beer ?'
1 HELLO LINUX!
2 Linux is a free unix-type opterating system.
Drink tea or ......
drink beer ?
3 This is a linux testfile!
4 Linux test
5 Google
6 Taobao
7 サンプル
8 Tesetfile
9 Wiki
各行の間には必ずバックスラッシュ\を使用して改行をマークします。上記の例では、1行目の最後に\が存在することがわかります。
行単位での置換と表示
第2-5 行目の内容をNo 2-5 numberに置き換えるにはどうすればよいでしょうか?
$ nl testfile | sed '2,5c No 2-5 number'
1 HELLO LINUX!
No 2-5 number
6 Taobao
7 サンプル
8 Tesetfile
9 Wiki
この方法を使えば、データを行全体で置き換えることができます。
testfile ファイル内の5〜7行目のみをリスト表示します:
$ nl testfile | sed -n '5,7p'
5 Google
6 Taobao
7 サンプル
この sed の行単位の表示機能を使用すると、ファイル内の特定の行番号を選択して表示することができます。
データの検索と表示
testfile からooキーワードを含む行を検索します:
$ nl testfile | sed -n '/oo/p'
5 Google
7 サンプル
root が見つかった場合、すべての行を出力するだけでなく、一致した行も出力します。
データの検索と削除
testfile からooを含むすべての行を削除し、その他の行を出力します
$ nl testfile | sed '/oo/d'
1 HELLO LINUX!
2 Linux is a free unix-type opterating system.
3 This is a linux testfile!
4 Linux test
6 Taobao
8 Tesetfile
9 Wiki
データの検索とコマンド実行
testfile を検索し、ooに対応する行を見つけ、後ろの波括弧内の一連のコマンドを実行します。各コマンドはセミコロンで区切ります。ここではooをkkに置き換え、この行を出力します:
$ nl testfile | sed -n '/oo/{s/oo/kk/;p;q}'
5 Gkkgle
最後のqは終了です。
データの検索と置換
行全体の処理モードに加えて、sed は行単位で部分データの検索と置換も行うことができます。
sed の検索と置換はviコマンドに似ています。構文形式は以下の通りです:
sed 's/要被取代的字串/新的字串/g'testfile ファイルの各行で最初に出現する oo を文字列 kk に置き換え、そのファイルの内容を標準出力に出力します:
sed -e 's/oo/kk/' testfile
gフラグはグローバル検索置換を表し、sed がファイル内のすべての一致する文字列を置き換えます。変更後の内容は標準出力に出力され、元のファイルは変更されません:
sed -e 's/oo/kk/g' testfile
オプションiを使用すると sed がファイルを変更します:
sed -i 's/oo/kk/g' testfile
現在のディレクトリ内のtestで始まるファイルを一括操作します:
sed -i 's/oo/kk/g' ./test*
次に /sbin/ifconfig を使用して IP を確認します:
$ /sbin/ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84 inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 .....(以下省略).....
このマシンの IP は 192.168.1.100 です。
IP の前の部分を削除します:
$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
次に後続の部分を削除します。つまり:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0。
IP の後の部分を削除します:
$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g' 192.168.1.100
複数編集
1つの sed コマンドで、testfile の3行目から末尾までのデータを削除し、HELLO を サンプル に置き換えます:
$ nl testfile | sed -e '3,$d' -e 's/HELLO/サンプル/'
1 サンプル LINUX!
2 Linux is a free unix-type opterating system.
-e は複数編集を表します。最初の編集コマンドは testfile の3行目から末尾までのデータを削除し、2番目のコマンドは HELLO を検索して サンプル に置き換えます。
ファイル内容を直接変更(危険な操作)
sed はパイプコマンドやデータストリームリダイレクトを使用せずに、ファイルの内容を直接変更できます!ただし、この操作は元のファイルを直接変更するため、システム設定をむやみにテストに使用しないでください!ここでは regular_express.txt ファイルを使用してテストしてみましょう!
regular_express.txt ファイルの内容は以下の通りです:
$ cat regular_express.txt サンプル. google. taobao. facebook. zhihu- weibo-
sed を使用して、regular_express.txt 内の各行の末尾が . の場合は ! に置き換えます
$ sed -i 's/\.$/\!/g' regular_express.txt $ cat regular_express.txt サンプル! google! taobao! facebook! zhihu- weibo-:q:q
sed を使用して regular_express.txt の最後の行に直接次の内容を追加します。# This is a test:
$ sed -i '$a # This is a test' regular_express.txt $ cat regular_express.txt サンプル! google! taobao! facebook! zhihu- weibo- # This is a test
$ は最後の行を表し、a のアクションは追加であるため、ファイルの最後に次の内容が追加されます。# This is a test!
sed の-iオプションはファイルの内容を直接変更でき、この機能は非常に役立ちます!例えば、100万行のファイルがあり、100行目に文字を追加したい場合、vim を使うと発狂してしまうかもしれません!ファイルが大きすぎるからです!ではどうすればいいでしょうか?sed を利用するのです!sed の直接変更・置換機能を使えば、vim で修正する必要すらありません!
その他の拡張
Linux コマンド大全