sed + awk をすこしさわった
dotinstall で sed と awk の講座が出たから*1せっかくなのでやってみた。思えば grep | sed しか知らないくらいだし、awk なにそれこわいという状態だし。
sed入門 (全10回) - プログラミングならドットインストール
AWK入門 (全13回) - プログラミングならドットインストール
sed(gsed)
GNU sed を使うため、Mac の場合は gnu-sed をインストールする必要がある。
引数
- f file
- e exec
- これは省略可能
- i repalce
- n
- あんまりわかってないけど sed -n 'p' file みたいに p するときに他のを出力しない的な
パターンスペース
アドレスに対してコマンドを実行する。記号はだいたい vi 準拠っぽい感じ
# not 3!d # それぞれ指定 1d;4d # 範囲 1,3d # 末尾 $d # 正規表現っぽいけどちょっと正規表現じゃない操作 /hoge$/d
- p = 表示
- a = apppend
- i = insert
- y = copy
まあ vi 準拠なので馴染みやすい
ホールドスペース
パターンスペースの裏でよしなにする。正直難しかったし使わなさそうでだるかった。
- パターンスペースのバックグランドで動作する
- hでhold
- gでget
- x で excahge(交換)
awk(gawk)
引数と実行
- f file
- コマンドラインでは '{}' で実行(""はだめ)。文字列リテラルは "hoge" で文字列連結は space で
概要
行指向スクリプト。レコードに対してフィールドを操作する。行志向スクリプト, Cっぽいらしい。
特殊引数
- $0,1,2で参照 $0 は全体
- NR は行番号
- NF はフィールドの数
文法
大きく分けて処理としては3つになる
- BEGIN {...}
- something(条件など) {...}
- something(条件など) {...}
- something(条件など) {...}
- END {...}
BEGIN でよしなに初期設定とかできる。デリミタ(FS(Field Separator))とか、RS でフィールドの区切りとかなんとか。
あと比較演算子と論理演算子とかもある。 (pattern) || (pattern) {command} 比較演算子には正規表現もある(~)。if 的条件もある NR < 5 とか。
関数
文字列、数値、システムコール、配列、辞書とかそれっぽいものがひととおりある。
まあ
シェルスクリプトだるいですね。そりゃシェルスクリプトだるくて Perl つくったのうれしいね。がんばってパースするのやだ。でも zsh とかで使えるかも、しれない。たぶんつらぽよくてきっとやらない。
*1:ちょうどこの記事をかいたとき