ぼくのかんがえたさいきょうの

archiving something about I'm interested in; computer etc.

ドットインストールをまとめる(sed入門)

sed入門

#01 sedとはなにか?

  • 概要
    • テキスト処理ツール
  • 知識
    • Unixコマンド
    • 正規表現
    • vim
  • 環境
    • GNU sed 4.1.5

#02 はじめてのsed

行の削除

3行目を消すには ’3d’ を指定する。

  • -eexpression
$ sed -e '3d' sample.txt

-e を消してもOK

$ sed '3d' sample.txt

ファイルを直接編集するには -i オプションをつける

$ sed -i -e '3d' sample.txt

バックアップファイルも作成できる。

(この場合、変更された sample.txt と変更前の内容をもつ sample.txt.bak が作成される。)

$ sed -i.bak -e '3d' sample.txt

別ファイルに書いたコマンドを実行することもできる。

以下の内容のex1.sedファイルがある時

$ cat ex1.sed
3d

-f オプションを指定するとファイルの内容の処理を実行する。

$ sed -f ex1.sed sample.txt

#03 パターンスペースについて理解しよう

sedの命令はaddressとcommandから構成される。

3dの例では以下の構成

address command
3 d

sedが処理するときはパターンスペースという一時的なバッファを使う。

処理の流れは以下の通り。

  1. fileから一行読み込んでパターンスペースに格納
  2. addressにマッチ? → command実行!
  3. パターンスペースを表示

#04 アドレスを使いこなそう

3行目以外を削除

  • ! で否定
$ sed -e '3!d' sample.txt

1行目と3行目を削除

  • 複数指定するときは ; で区切る。
$ sed -e '1d;3d' sample.txt

1から3行目を削除

  • 範囲の指定は , カンマで区切る。
$ sed -e '1,3d' sample.txt

1行目から2行おきに削除

  • ~で指定する。
$ sed -e '1~2d' sample.txt

最終行を削除

  • $で最終行を表す。

    最終行のみ削除

    $ sed -e '$d' sample.txt
    

    3行目から最終行まで削除

    $ sed -e '3,$d' sample.txt
    

正規表現を使う。

  • / で囲む。

    iで終わる行を削除

$ sed -e '/i$/d' sample.txt

アドレス省略するとすべての行が対象になる。

全行削除
$ sed -e 'd' sample.txt

#05 p/a/iコマンドを使ってみよう

p(print)

指定した行を印字する。

以下の例では指定した行が2回表示される。

$ sed -e '3p' sample.txt

-n オプション(パターンスペースの表示抑止)と組み合わせると、指定した行のみの表示になる。

$ sed -n -e '3p' sample.txt

q(quit)

指定した行で処理を抜ける。

以下の例では3行目まで表示して終わる。

$ sed -e '3q' sample.txt

i(insert)

前の行に挿入する。

  • 挿入したい文を \ に続ける
$ sed -e '3i\---- insert ----' sample.txt

a(append)

後ろの行に追加する。

  • 挿入したい文を \ に続ける
$ sed -e '3a\---- append ----' sample.txt

#06 yコマンドで置換してみよう

yコマンドは1文字づつの置換

全行で小文字のtを大文字Tにする。

$ sed -e 'y/t/T' sample.txt

複数の文字を対象にする場合(t→T、o→O)

  • 一文字の置換なので、toをTOにするのではない。
  • 順序も対応している。
$ sed -e 'y/to/TO' sample.txt

#07 sコマンドで置換してみよう

sコマンドは文字列の置換

単純な指定では最初にマッチした1つのみ

$ sed -e 's/apple/Apple/' sample.txt

フラグ g をつけるとすべてが対象になる。

$ sed -e 's/apple/Apple/g' sample.txt

フラグ 2 をつけると2つ目にマッチした文字列のみが置換される。

$ sed -e 's/apple/Apple/2' sample.txt

フラグ i をつけると大文字小文字を区別しない。

  • フラグは複数指定してもよい。
$ sed -e 's/apple/Ringo/ig' sample.txt

正規表現を使用してもよい。

$ sed -e 's/[aA]pple/Ringo/g' sample.txt

#08 &や1を使って置換してみよう

マッチした文字列を置換する文字列に使いたい場合
(1を置換して【1】にするとか)

マッチした文字列は & で使用できる。

$ sed -e 's/[1-2]/【&】/' sample.txt

複数マッチする場合は \1 , \2 ,,, \n で使用できる。

順序を入れ替える例

  • () で囲むことで複数の文字列を指定できる。
    • () はエスケープが必要なので注意
$ sed -e 's/\([1-2]\) \(.*\)/\2 【\1】/' sample.txt

#09 ホールドスペースを使ってみよう(1)

複数行にまたがる処理を実行したい場合に使用する。

ホールドスペース
パターンスペースのさらに奥にあるバッファのイメージ

コマンド

h
hold パターンスペースの中身をホールドスペースに退避する。
g
get ホールドスペースの中身をパターンスペースに戻す。
x
exchange 両者を交換する。

style.css

#main {
    color: red;
    font-weight: bold;
    font-size: 14px;
    background: green;
}

ex2.sed

# color change

/color: / {
    h
    s/color: /background: /
    x
}
/background: / {
    g
}
$ sed -f ex2.sed style.css

#10 ホールドスペースを使ってみよう(2)

処理の解説

1行目 パターンスペースの内容を表示

2行目 /color: / にマッチするので処理を実行

  1. 処理実行前の状態
pattern space color: red;
hold spase  
  1. ホールドスペースにパターンスペースの内容を格納
pattern space color: red;
hold spase color: red;
  1. パターンスペースで置換を実行
pattern space background: red;
hold spase color: red;
  1. パターンスペースとホールドスペースを交換
pattern space color: red;
hold spase background: red;
  1. パターンスペースの内容を表示

3,4行目 パターンスペースの内容を表示

5行目 /background: / にマッチするので処理を実行

  1. 処理実行前の状態
pattern space background: green;
hold spase background: red;
  1. ホールドスペースの内容をパターンスペースに戻す。
pattern space background: red;
hold spase background: red;
  1. パターンスペースの内容を表示

6行目 パターンスペースの内容を表示