sed 流編集器#
説明:
sed
は、テキスト処理に非常に重要なツールであるストリームエディタです。正規表現と完璧に連携して使用することができ、非常に優れた機能を持っています。処理中、現在処理している行を一時的なバッファに保存し、「パターンスペース」と呼ばれます。その後、sed
コマンドでバッファの内容を処理し、処理が完了したらバッファの内容を画面に送ります。次に、次の行を処理し、これを繰り返し、ファイルの終わりまで続けます。ファイルの内容は変更されませんが、リダイレクトを使用して出力を保存する場合を除きます。sed
は、主に 1 つまたは複数のファイルを自動的に編集するために使用されます。ファイルの繰り返し操作を簡略化したり、変換プログラムを作成したりするためにも使用されます。
構文:
sed [オプション]... {スクリプト(他のスクリプトがない場合)} [入力ファイル]...
sed の実行プロセス#
sed コマンドオプション#
オプション | 機能 |
---|---|
-n | デフォルトの sed 出力をキャンセルし、処理後の結果のみを出力します。通常、p アクションと一緒に使用します。 |
-r | 拡張正規表現を使用することをサポートします。 |
-i | ファイルを直接編集し、-i を使用しない場合は、バッファの内容のみが変更されます。 |
-e | 複数の編集を実行し、パイプラインと同じ役割を果たします。 |
-f | sed スクリプトの編集コマンドを実行します。 |
sed 編集コマンド#
アクション | 説明 |
---|---|
a\ | 追加、現在の行の下にテキストを挿入します(\ またはスペースを使用できます) |
i\ | 挿入、現在の行の上にテキストを挿入します |
c\ | 変更、選択した行を新しいテキストに変更します |
d | 削除、選択した行を削除します |
p | 印刷、一致する内容を印刷します。通常、-n オプションと一緒に使用します |
s | 置換、一致する内容を置換します。正規表現をサポートします |
n | 次の入力行を読み取り、次のコマンドを実行します |
w | パターンに一致する行を指定されたファイルに保存します |
r | 指定されたファイルのテキストをパターンスペースに読み込みます |
= | パターンスペースの行に行番号を印刷します |
! | パターンスペースの一致する行を反転処理します |
sed 置換タグ#
シンボル | 説明 |
---|---|
g | 行内のすべての一致を置換します。デフォルトでは、各行の最初の一致のみが置換されます。ng は、n 番目の一致から置換することを意味します。 |
\n | サブストリングの一致タグ;\n は、n 番目のグループの内容を表します。 |
& | 一致した文字列のタグ |
s 置換コマンドの説明
"デリミタ"
- 置換コマンドでは、デリミタとして
/
をよく使用しますが、:
、#
、@
などのカスタムデリミタを使用することもできます。- 内部でデリミタが使用される場合は、エスケープする必要があります。例えば、
sed 's:[0-9]:\::' test.txt
は、デリミタとして:
を使用し、すべての数字を:
に置換します。
"複数の式の組み合わせ"
- sed の置換コマンドは、他のコマンドと組み合わせて使用することができます。たとえば、最初の行のすべての小文字を
#
に置換して印刷する場合は、次のようにします。
shell sed '1s/[a-z]/#/gp' test.txt
- 他のコマンドも複数の式を組み合わせて使用することができます。次の 3 つの方法があります(同じ行で複数のコマンドを実行し、順序に影響を受けます)
sed '式1' | sed '式2' sed '式1; 式2' sed -e '式1' -e '式2'`
"サブストリングの一致(逆参照)"
- 指定したパターンの一部に一致するものをマッチングし、
()
グループと組み合わせて使用します。\n
は、n 番目のグループの一致を表します。
"一致した文字列"
&
を使用して、一致したすべての内容を表すことができます。サブストリングの一致を使用して実現することもできます。
sed マッチ範囲#
範囲 | 説明 |
---|---|
全文 | 全文を処理します。 |
指定行 | 指定したファイルの特定の行;'1p' は最初の行を印刷します。 |
指定パターン | /pattern/ に一致する各行; '/^H/' は H で始まる行を表します。 |
指定範囲区間 | 範囲内の各行;'1,3' は 1 行目から 3 行目までを表します;'1,+2' は 1 行目と次の 2 行を表します;'$' は最後の行を表します。 |
指定ステップ | ステップに基づいて行をマッチングします;'1~2' は 1,3,5,7,... の奇数行を表します; '2~2' は 2,4,6,8... の偶数行を表します。 |
行範囲とパターン範囲は、範囲区間として組み合わせて使用することができます。
sed コマンドの例#
# 5行目を印刷する
[root@localhost ~]# sed -n '5p' test.txt
# 各行の下にテキスト"day day up"を追加する(元のファイルは変更されません)
[root@localhost ~]# sed 'a day day up' test.txt
# 1行目の上に2行のテキスト"abcde"と"ABCDE"を追加する
[root@localhost ~]# sed -i '1i abcde\nABCDE' test.txt
# 最後の行を"66666"に変更する
[root@localhost ~]# sed -i '$c 66666' test.txt
# すべての文字"A"を"a"に変更する
[root@localhost ~]# sed -i 's/A/a/g' test.txt
# 最初の2行を削除する
[root@localhost ~]# sed -i '1,2d' test.txt
# 'l'で始まる次の行をファイルfile.txtに書き込む
[root@localhost ~]# sed -n '/^l/w file.txt' test.txt
# file.txtの内容を5行目の下に書き込む
[root@localhost ~]# sed -i '5r file.txt' test.txt
# 'l'で始まる行の次の行を削除する
[root@localhost ~]# sed -i '/^l/{n;d;}' test.txt
# 2-5行以外の行を印刷する
[root@localhost ~]# sed -n '2,5!p' test.txt
# 1回以上出現するすべての文字'b'を数字'8'に変更して印刷する
[root@localhost ~]# sed -nr 's/b+/8/gp' test.txt
# 6行目の内容を削除し、すべての'*'を'#'に変更する
[root@localhost ~]# sed -i -e '5d' -e 's/*/#/g' test.txt
# ファイルfile.sedにsedスクリプトを書き込み、test.txtファイルの最初の行から'?'までの行を印刷する
[root@localhost ~]# echo "/1,/^A/p" > file.sed
[root@localhost ~]# sed -n -f file.sed test.txt
## 逆参照
-- 保護してから使用する
# "hello world"を"[hello] [world]"に変更する
[root@localhost ~]# echo "hello world" | sed -r 's/(\w+)/[\1]/g'
[root@localhost ~]# echo "hello world" | sed -r 's/\w+/[&]/g'
# 各行の最初の3回連続する文字列を'嗯哼~'に変更する
[root@localhost ~]# sed -r -i 's/([a-z])\1\1/嗯哼~/' test.txt
# LinuxのIPアドレスを取得する
[root@localhost ~]# ip a s eth0
9: eth0: <> mtu 1500 group default qlen 1
link/ether d8:c4:97:92:73:08
inet 169.254.248.50/16 brd 169.254.255.255 scope global dynamic
valid_lft forever preferred_lft forever
inet6 fe80::5219:3165:3e7d:41fb/64 scope link dynamic
valid_lft forever preferred_lft forever
[root@localhost ~]# ip a s eth0 | sed -nr '3s/(^.*t )(.*)(\/.*$)/\2/gp'
# sedコマンドを使用して任意の3つの小文字を逆順にする。例:'abc'を'cba'に変更する
[root@localhost ~]# echo "abc" | sed -n 's/([a-z])([0-z])(a-z)/\3\2\1/p'