sedコマンドの備忘録

  • 166
    いいね
  • 0
    コメント

特殊文字

.                  # 任意の一文字
*                  # 直前の文字が任意の個数続く文字列(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のみの行までを削除