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