おぼえがき

おぼえがき

sed 複数行を一行に置換

2007-02-27 | sed awk
ファイルの中身が以下のようになっている
-----------------------
1111111111
2222222222
abc
3333333333
4444444444
5555555555
jhi
4444444444
5555555555
6666666666
-----------------------

で、

abcからjhiの間までを
3333333333
に置換したい。


sed "/abc/,/jhi/c¥(¥がいる)
3" ${ファイル名}

ってやれば、

-----------------------
1111111111
2222222222
3333333333
4444444444
5555555555
4444444444
5555555555
6666666666
-----------------------


なるほどね


cのほかに、
a(追加)パターンスペースのカレント行の後ろに指定のテキストを入れる
i(挿入)パターンスペースのカレント行の前に指定のテキストを入れる

sed 読み込んだファイルの内容を置換する

2007-02-27 | sed awk
テンプレートにスタイルシートの宣言がXXXXXXって入ってて、
それを削除した上に、3行変わりにYYYYって言うファイルの中に
入っているスタイルシートの行を追加したい。




for i in $(ls -1 該当テンプレートファイル);
do
 sed -i '/XXXXXX/ {    #XXXXXX にマッチしている行を抽出
 r YYYYY         #YYYYYからファイルを読み込む
 /.*XXXXXX.*$/d      #XXXXXXの行は、削除
}' $i;
done

できる。

ちょっと感動。

awk システム変数を理解(FS OFS RS ORS NF NR FILENAME)

2007-02-23 | sed awk
awk 'BEGIN {FS="n"; RS="ORS="-"} {print $1,$NF}' aaaa

ファイルの中身
-----------------
1
2
3

4
5
6

7
8
9
-----------------

以下のスクリプトの実行

ファイルの1から3 4から6 7から8をひとつのデータとして考える

awk '
 BEGIN {
  FS="n";      # カラムの区切りを改行に
  RS="";       # レコードの区切りを空白に(ファイルの3と4の間)
  OFS="*";      # 出力のデミリタ(カンマがあればOFSに変わる $1,$NFの部分)
  ORS="nn"     # 出力のデミリタ(改行二つが1回ごとの実行のデミリタとなる)
 }

 {
  print NR"." $1,$NF # NR:現在の行 / NF:1レコードの最大カラムの位置
 }

 END {
  print FILENAME   # FILENAME : ファイル名の出力
 }' ファイル名


-----------------
結果

1.1*3

2.4*6

3.7*9

ファイル名
-----------------

awk 変数(パラメータ)の渡し方

2007-02-23 | sed awk
awk 'BEGIN {print AA}' AA="XYZ"
ってやっても、

XYZ

を出力してくれない。

これは、awkの制約で、最初の入力行が読み込まれた後でなければ、
コマンドラインパラメータには、アクセスできないため。

つまり、BEGINの中では、アクセスできない・・・


だけど、


-v オプションを使えば、そうでもなくなるわけで、

awk -v AA='XYZ' 'BEGIN {print AA}'

ってやると、XYZが出力される。

-vオプションは、スクリプトの前に書くこと。

これで、これも納得できる。