Linux

[Linux]sedコマンド

sedコマンドとは

文字列を全置換したり、行単位で抽出したり、削除したり、いろいろなテキスト処理のできるコマンド。処理内容はコマンドラインパラメータで指定して、非対話的に一括処理できる。

sedで書ける処理であれば、処理内容にもよるが、perlのワンライナーで書くよりも速いことが多い。

sedというコマンド名は Stream EDitor の略らしい。

特殊文字

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

リンク

http://qiita.com/takech9203/items/b96eff5773ce9d9cc9b3
https://hydrocul.github.io/wiki/commands/sed.html

コメントを残す