Help us understand the problem. What is going on with this article?

sedコマンドの備忘録

More than 3 years have passed since last update.

特殊文字

.                  # 任意の一文字
*                  # 直前の文字が任意の個数続く文字列(0個も含む)
<space><space>*    # 連続するSPACEを表す 
<tab>              # TAB
.*                 # 任意の文字列

置換(Substitute)の基本

s/regular expression/replacement/flags
sed -e "s/aaaa/bbbb/"       # 置換 行で最初に出てきた'aaaa'を'bbbb'に置換
sed -e "s/aaaa/bbbb/g"      # 入力の全行に渡って置換 (Global)
sed -e "s/^aaaa/bbbb/"      # 行頭(^)に'aaaa'のもの
sed -e "s/aaaa\$/bbbb/"     # 行末($)に'aaaa'のもの。$は\でescape
sed -e "s/~/bbbb/"          # 行頭に'bbbb'を追加
sed -e "s/\$/bbbb/"         # 行末に'bbbb'を追加
sed -e "s/.*/abcd/"         # すべての行を'abcd'に置換
sed -e "s/aa.*bb//"         # aa*bbを削除

デリミタ

置換では/(スラッシュ)がデリミタ(区切り文字)として使われることが多いが、実際はデリミタはどの文字でもよい。
s の次の文字がデリミタになる。

cat file | sed -e "s@old1@new1@g" -e "s/old2/new2/g"
cat file | sed -e "s@ol/d1@n/ew1@g" -e "s/old2/new2/g"  ol/d1 を n/ew1 に置換

TAB, SPACE

sed -e 's/<tab>/<space>/g'                       # TABをSPACEに置換
sed -e "s/<space><space>*/<space>/g"             # 複数のスペースを<space>に置換。<space>*ではない
sed -e "s/[<tab><space>][<tab><space>]*/<space>/g"   # ホワイトスペースを<space>に置換

同時に複数の置換処理を実行

cat file | sed -e "s/old1/new1/g" -e "s/old2/new2/g"

行の削除

sed -e "/条件/d"

sed -e '1d' file                # 1行目を消去
sed -e '1,4d' file              # 1-4行目を消去
sed -e "/$d" file               # 最終行を消去
sed -e '$-3,$d' file            # 最後の4行を消去。$-3:最後から数えて3行目、すなわち最後から4行目
sed -e "/aaa/d"                 # aaaを含む行を削除 sはいらない
sed -e "/^[<space><tab>]*$/d"   # 空白行の削除

指定した行だけ表示 (-nオプション)

sed -n '1,4p' file
sed -n '$p' file
sed -n '2p'                # 指示した行だけを標準出力に
sed -n '2p' < file
sed -n "s/aaaa/bbbb/gp"    # テキストが置換された行だけを表示

文字列の一部分を取り出す

sed -e "s/aa.*\(.*\)b\(.*\)b/\1/"    # 1つ目の()で囲まれた部分を取り出す。()は\でescapeする
sed -e 's/aa.*(.*)b(.*)b/\2/'        # 2つ目の()で囲まれた部分を取り出す
$ id root
uid=0(root) gid=0(root) groups=0(root)
$ id root | sed -e 's/uid=\(.*\)(\(.*\)) gid=.*/\1/'
0
$ id root | sed -e 's/uid=\(.*\)(\(.*\)) gid=.*/\2/'
root

キーワードによる行の指定

sed -e '2,$s/aaa/bbb/g' file         # 2行目から最終行まで処理する
sed -e '/aaaa/,/bbbb/d' file         # aaaaを含む行からbbbbを含む行までを削除
sed -n '/aaaa/,/bbbb/p' file         # aaaaを含む行からbbbbを含む行までを表示

sed -n '/^BEGIN$/,/^END$/p' file     # BEGINのみの行からENDのみの行までを表示する
sed -n '/^BEGIN$/,/^END$/!p' file    # BEGINのみの行からENDのみの行までを表示しない
sed -e '/^BEGIN$/,/^END$/d' file     # BEGINのみの行からENDのみの行までを削除
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away