English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Linux sed コマンド

Linux コマンド全集

Linux sed コマンドはスクリプトを使用してテキストファイルを処理します。

sedは、スクリプトの指示に従ってテキストファイルを処理、編集します。

sedは、ファイルを自動的に編集し、ファイルに対する繰り返し操作を簡略化し、変換プログラムを書くために主に使用されます。

文法

sed [-hnV][-e<script>][-f<scriptファイル>][テキストファイル]

パラメータ説明

  • -e<script>または--expression=<script> :指定されたscriptを使用して入力のテキストファイルを処理します。

  • -f<scriptファイル>または--file=<scriptファイル> :指定されたscriptファイルを使用して入力のテキストファイルを処理します。

  • -hまたは--help :ヘルプを表示します。

  • -nまたは--quietまたは--silent :script処理後の結果のみを表示します。

  • -Vまたは--version :バージョン情報を表示します。

アクション説明

  • a :追加、aの後ろに文字列を続けることができます。これらの文字列は新しい行に表示されます(現在の次の行)~

  • c :置換、cの後ろに文字列を続けることができます。これらの文字列はnで置換されます。1,n2 の間の行!

  • d :削除、削除であるため、dの後ろには何も続けません;

  • i :挿入、iの後ろに文字列を続けることができます。これらの文字列は新しい行に表示されます(現在の前の行);

  • p :印刷、特定のデータを印刷することを意味します。通常、pはsedの -n で一緒に実行します~

  • s :置換、直接置換を行うことができます。通常、このsの動作は正規表現と組み合わせることができます。例えば 1,20s/old/new/g だってさ!

オンラインサンプル

testfileファイルの第四行の次に一行を追加し、結果を標準出力に表示するために、コマンドプロンプトで以下のコマンドを入力してください:

sed -e 4a\newLine testfile

まず、testfileの中身を以下のように確認してください:

$ cat testfile #testfileの中身を確認  
HELLO LINUX!  
Linux is a free unix-type operating system.  
This is a linux testfile!  
Linux test

sedコマンドの使用後、以下のような出力結果が得られます:

$ sed -e 4a\newline testfile #sedを使用して第四行の次に新しい文字列を追加  
HELLO LINUX! #testfileファイルの元の内容  
Linux is a free unix-type operating system.  
This is a linux testfile!  
Linux test  
newline

行単位で追加/削除

追加 /etc/passwdの内容が列挙され行番号も表示され、同時に、以下の行を列印してください。 2~5 行が削除されています。

[root@www ~]# nl /etc/passwd | sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
.....(以下省略).....

sedのアクションが'2,5d'がありません。したがって、表示されるデータには 2-5 行が削除されましたので、表示されるデータには 2-5 行を削除しましたので、表示されるデータには -eが正しいです。ありません -eもできます!また、sedの後ろに続くアクションは、必ず''の単引号で括ってください!

行を削除する場合 2 行

nl /etc/passwd | sed '2d'

行を削除する場合 3 最後の行まで

nl /etc/passwd | sed '3$d'

2行目の後ろ(つまり3行目に追加)に『drink tea?』と記述します!

[root@www ~]# nl /etc/passwd | sed '2a drink tea'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(以下省略).....

それでは、2行目の前に

nl /etc/passwd | sed '2i drink tea'

2行以上を追加する場合は、2行目の後ろに2行のテキストを追加します。例えば、 Drink tea or ...... および drink beer?

[root@www ~]# nl /etc/passwd | sed '2a Drink tea or ......\
> drink beer ?'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(以下省略).....

各行間には必ず反斜線『\』で新しい行を追加する必要があります。したがって、上記の例では、最初の行の最後に\があります。

行単位の置き換えおよび表示

第2-5行の内容を『No』に置き換えます。 2-5 number』ですか?

[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number'
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
.....(以下省略).....

この方法を使用すると、データを一行単位で置き換えることができます!

のみ一覧表示 /etc/passwdファイルの第 5-7 行

[root@www ~]# nl /etc/passwd | sed -n '5,7p'
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

このsedの行単位の表示機能を使用すると、特定のファイル内の特定の行番号を選択して表示することができます。

データの検索および表示

検索 /etc/passwdにrootキーワードを持つ行

nl /etc/passwd | sed '/root/p'
1  root:x:0:0:root:/root:/bin/bash
1  root:x:0:0:root:/root:/bin/bash
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh
4  sys:x:3:3:sys:/dev:/bin/sh
5  sync:x:4:65534:sync:/bin:/bin/sync
....以下は省略

rootが見つかった場合、すべての行を出力するだけでなく、マッチング行も出力します。

使用-nの時にはテンプレートを含む行のみを印刷します。

nl /etc/passwd | sed -n '/root/p'
1  root:x:0:0:root:/root:/bin/bash

データの検索および削除

削除/etc/passwdに含まれるrootの行をすべて出力し、他の行は出力しない

nl /etc/passwd | sed  '/root/d'
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh
....以下は省略
#最初の行のマッチングrootが削除されました

データの検索およびコマンドの実行

検索/etc/passwd、rootに対応する行を見つけ、後ろ括弧内のコマンドセットを実行します。各コマンドはセミコロンで区切られます。ここではbashをblueshellに置き換え、その行を出力します:

nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q'    
1  root:x:0:0:root:/root:/bin/blueshell

最後のqは退出です。

データの検索および置き換え

整行処理モードの他に、sedは行単位でデータの検索および置き換えを行うことができます。基本的には、sedの検索と置き換えはviと非常に似ています!こちらのようになります:

sed 's/置き換えたい文字列/新しい文字列/g'

元の情報を観察し、 /sbin/ifconfigでIPを確認

[root@www ~]# /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の前の部分を削除します。

[root@www ~]# /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の後ろの部分を削除します。

[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.1.100

複数点編集

sedコマンドで削除/etc/passwdの第3行から最後までのデータ、bashをblueshellに置き換えます。

nl /etc/passwd | sed -e '3$d' -e 's/bash/blueshell/'
1  root:x:0:0:root:/root:/bin/blueshell
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh

-eは複数点編集を意味し、最初の編集コマンドは削除/etc/passwdの第3行から最後までのデータ、2番目のコマンドはbashをblueshellに置き換えます。

ファイル内容を直接変更する(危険なアクション)

sedは直接ファイルの内容を変更することができます。パイプコマンドやデータストリームリダイレクトを使用する必要はありません!ただし、このアクションは直接元のファイルを変更するため、システム設定を無作為にテストすることは絶対にしないでください!私たちはファイル regular_express.txtを使用してテストをしてみましょう!

regular_express.txt ファイルの内容は以下の通りです:

[root@www ~]# cat regular_express.txt 
w3codebox.
google.
taobao.
facebook.
zhihu-
weibo-

sedを使ってregular_express.txt内の各行の最後に . があればそれを ! に置き換えます

[root@www ~]# sed -i 's/\.$/\!/g' regular_express.txt
[root@www ~]# cat regular_express.txt 
w3codebox!
google!
taobao!
facebook!
zhihu-
weibo-

:q:q

regular_express.txtの最後の行に直接sedを使って追加します # This is a test:

[root@www ~]# sed -i '$a # This is a test' regular_express.txt
[root@www ~]# cat regular_express.txt 
w3codebox!
google!
taobao!
facebook!
zhihu-
weibo-
# This is a test

由于 $ は最後の行を指し、a のアクションは追加するため、このファイルの最後に追加されます # This is a test

sed の -i オプションを使ってファイル内容を直接修正することができます。この機能は非常に役立ちます。例えば、あなたが 100 万行のファイル、あなたはその行に 100 行にいくつかの文字を追加するとき、vim を使うと狂うかもしれません!なぜならファイルが大きすぎるからです!それではどうしますか?sed を使って直接修正します。/置き換える機能で、vim を使わなくても済みます!

Linux コマンド全集