1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルテキスト処理三銃士におけるsedの使用について

2022-02-08 11:47:57

sedはstream editorの略で、主に標準出力やファイルの処理に使用されます。

シンタックス

stdout | sed [option] "pattern command"
sed [option] "pattern command" file1

共通オプション(option)

# -n prints only the silent mode match line, not the original line
# p is the print command
➜ sed '/hello/p' helloWorld.sh
#! /bin/bash

HELLO bash
echo "hello world"
echo "hello world"
➜ sed -n '/hello/p' helloWorld.sh
echo "hello world"

# -e append a set of edit commands
➜ sed -n -e '/hello/p' -e '/HELLO/p' helloWorld.sh
HELLO bash
echo "hello world"

# -f Saves all editing commands in a file, for complex editing operations
➜ cat edit.sed
/hello/p
➜ sed -n -f edit.sed hello.md

# -E (or -r) supports extended regular expressions
➜ sed -n -E '/hello|HELLO/p' helloWorld.sh
HELLO bash
echo "hello world"

# -i modifies the source file directly
# s is the replace command
# here is to change all the hello in helloWorld.sh file to hello123
sed -n -i 's/hello/hello123/g' helloWorld.sh



マッチングパターン(パターン)

<テーブル マッチングパターン 説明 10コマンド 10行目 10,20コマンド 10行目から20行目 10,+5コマンド 10行目から16行目 /パターン1/コマンド pattern1 に対応する行にマッチする /pattern1/,/pattern2/コマンド パターン1に対応する行から始まり、パターン2に対応する行に進む 10,/pattern1/コマンド 10行目からpattern1の行に移動する /pattern1/,10コマンド pattern1に対応する行から開始し、10行目まで進む

共通編集コマンド(コマンド)

クエリ

  • p マッチを表示する

追加

  • a string 行の後に追加する
  • i string 行の前に追加
  • r file 外部ファイルから読み込み、一致する行の後に追加する。
  • w newfile 一致した行を外部ファイルに書き出す

削除

  • d 削除

変更

  • s/old/new 行の最初のoldをnewに置き換える。
  • s/old/new/g 行中のすべてのoldをnewに置き換える。
  • s/old/new/2g 2行目からファイル末尾までの古いファイルをすべて新しいものに置き換えます。
  • s/old/new/ig 大文字小文字を区別せず、古いものを新しいものに置き換える。

# Delete lines that start with sys and end with /sbin/nologin
➜ sed -i '/^sys.*\/sbin\/nologin$/d' passwd_bak

# Delete comment lines, empty lines
sed -i '/[:blank:]*#/d;/^$/d' passwd_bak

# Find the line starting with vagrant, append the next line
➜ sed -i '/^vagrant/a This is the appended line' passwd_bak

# Replace all roots with root123
➜ sed -i 's/root/root123/ig' passwd_bak

# Append _666 to the end of all lines that start with sys and end with nologin
# where & indicates the previous regular match
➜ sed -i 's/^sys.*nologin$/&_666/g' passwd_bak

# Change all lines starting with sys and ending with nologin_666 to
# Start with SYS_ and end with _777, where \1 is the middle part of the match in the preceding parentheses
➜ sed -i 's/^sys\(. *\)nologin_666$/SYS_\1_777/g' passwd_bak

# Change all sys in lines 1 to 10 to SYS
➜ sed -i '1,10s/sys/SYS/ig' passwd_bak

# Count the number of mysqld subconfiguration items in my.cnf file
# sed finds the line from [mysqld] to the next [. *]
# grep -v filters comments, empty lines, and [. *] lines
# wc -l counts the last lines
sed -n "/^\[mysqld\]$/,/^\[. *\]$/p" /etc/my.cnf | grep -Ev '^$|[#;]|^\[. *' | wc -l



注意:マッチパターンに変数がある場合、二重引用符を使うことを推奨します。例えば、sed -i "s/$OLD_STR/$NEW_STR/g" passwd_bak

今回は、シェルテキスト処理の三剣士であるsedの使い方について紹介しましたが、シェルテキスト処理sedについては、スクリプトの館の過去記事を検索するか、引き続き以下の関連記事を閲覧してください。