siwen

siwen

😉

sedコマンド

sed 流編集器#

説明:

sedは、テキスト処理に非常に重要なツールであるストリームエディタです。正規表現と完璧に連携して使用することができ、非常に優れた機能を持っています。処理中、現在処理している行を一時的なバッファに保存し、「パターンスペース」と呼ばれます。その後、sedコマンドでバッファの内容を処理し、処理が完了したらバッファの内容を画面に送ります。次に、次の行を処理し、これを繰り返し、ファイルの終わりまで続けます。ファイルの内容は変更されませんが、リダイレクトを使用して出力を保存する場合を除きます。sedは、主に 1 つまたは複数のファイルを自動的に編集するために使用されます。ファイルの繰り返し操作を簡略化したり、変換プログラムを作成したりするためにも使用されます。

構文:

sed [オプション]... {スクリプト(他のスクリプトがない場合)} [入力ファイル]...

sed の実行プロセス#

image

sed コマンドオプション#

オプション機能
-nデフォルトの sed 出力をキャンセルし、処理後の結果のみを出力します。通常、p アクションと一緒に使用します。
-r拡張正規表現を使用することをサポートします。
-iファイルを直接編集し、-i を使用しない場合は、バッファの内容のみが変更されます。
-e複数の編集を実行し、パイプラインと同じ役割を果たします。
-fsed スクリプトの編集コマンドを実行します。

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' 
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。