FreeBSD初心者運用日記 このページをアンテナに追加

2012-03-22

[]置き換え対象の行を指定して置き換えする方法について 00:26 置き換え対象の行を指定して置き換えする方法について - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - 置き換え対象の行を指定して置き換えする方法について - FreeBSD初心者運用日記 置き換え対象の行を指定して置き換えする方法について - FreeBSD初心者運用日記 のブックマークコメント

$ cat hoge.dat
111
222
333
444
555
~$ sed 2,4s/[0-9]*/XXX/ hoge.dat
111
XXX
XXX
XXX
555

2008-11-24

[][]ファイル編集に関するチップス 11:08 ファイル編集に関するチップス - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - ファイル編集に関するチップス - FreeBSD初心者運用日記 ファイル編集に関するチップス - FreeBSD初心者運用日記 のブックマークコメント

ファイルの中にある"aaa"という文字列を、以下のように改行を含む文字列に変更したい場合を考える。

aaa
bbb
ccc

このような場合、sedで以下のように記述する。

#!/bin/sh

sed 's/aaa/aaa \
bbb \
ccc/' hoge.dat

※ \マークは、シェルに改行コードを解釈させないため。これがないと、文法エラーになる。(シェルは改行がコマンドデリミタのため)

ダブルコーテーションを使う場合は、\を\\とする。

#!/bin/sh

sed "s/aaa/aaa \\
bbb \\
ccc/" hoge.dat

※ \マークがふたついるのは、\マーク自体のエスケープが必要だからと思われる。

\マークがひとつだと、sed "s/aaa/aaa bbb ccc/" hoge.dat というコマンドが実行されるだけ。

ちなみに、シェルスクリプトの関数の中で、sedを使うときに

func hoge() {
    sed "s/hoge /foo \\
bar/"
}

このようになって、インデントがそろわない。格好が悪い。

これを解決する方法としては以下のようにする。

$ cat hoge.sh
#!/bin/sh
N='
'
echo hoge | sed "s/hoge/foo \\${N}bar/"
$ ./hoge.sh
foo
bar

[][]sedコマンドのトラブルシューティング 11:31 sedコマンドのトラブルシューティング - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - sedコマンドのトラブルシューティング - FreeBSD初心者運用日記 sedコマンドのトラブルシューティング - FreeBSD初心者運用日記 のブックマークコメント

以下のようなsedコマンドを実行する場合に、変数$barの値にスラッシュが含まれる場合、予めエスケープしないとだめ。(sedにとってスラッシュは特殊文字にあたるため)

sed "s/foo/$bar/" hoge.dat

2008-06-24

[][]sedコマンドのトラブルシューティング 01:58 sedコマンドのトラブルシューティング - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - sedコマンドのトラブルシューティング - FreeBSD初心者運用日記 sedコマンドのトラブルシューティング - FreeBSD初心者運用日記 のブックマークコメント

ファイルhoge.datがある。

$ cat hoge.dat
aaa 1
bbb 2
ccc 3

このファイルから前方参照で数字だけを抜き出そうと思い、sedを利用して以下のようにした。

$ sed 's/\([0-9]*\)$/\1/' hoge.dat
aaa 1
bbb 2
ccc 3

うむむ、、抜き出せない。。

それもそのはずで、この場合は行の数字の部分を数字で置き換えているだけなんである。

正しいやりかたはこのとおり。

$ sed 's/^.* \([0-9]*\)$/\1/' hoge.dat
1
2
3

sedは完全一致で文字列を指定しなくてはならない。

2007-12-17

[]基本知識 23:54 基本知識 - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - 基本知識 - FreeBSD初心者運用日記 基本知識 - FreeBSD初心者運用日記 のブックマークコメント

sedを利用する上でしっておいたほうがよいこと。

  • シェル変数を利用する場合は、ダブルコーテーションを使う。
  • 一個以上の繰り返しを表す"+"は利用できない。
  • 前方参照のために指定する"("や")"はエスケープする必要がある。
  • TABを置き換え文字に含めたい場合、ctrl+vしてからTABキーを押下。(Enterも同様)

[]文字列解析 23:46 文字列解析 - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - 文字列解析 - FreeBSD初心者運用日記 文字列解析 - FreeBSD初心者運用日記 のブックマークコメント

以下のようなファイルがあるとする。

$ cat hoge.dat
<option name="aaa1">bbb1</option>
<option name="aaa2">bbb2</option>
<option name="aaa3">bbb3</option>

このファイルから、以下の出力を導き出したい

aaa1,bbb1

aaa2,bbb2

aaa3,bbb3

これをsedで実現するにはいかのようにする。

sed  "s/<option name=\"\([^\"]*\)\">\([^<]*\)<.*/\1,\2/" hoge.dat

2007-07-24sedコマンド

[]sedコマンドで行削除 21:49 sedコマンドで行削除 - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - sedコマンドで行削除 - FreeBSD初心者運用日記 sedコマンドで行削除 - FreeBSD初心者運用日記 のブックマークコメント

以下のようなファイルがある。

$ cat hoge.dat
111
222
333

これを、こうしたい。

111
333

以下のようにしたら、、

$ sed 's/222//' hoge.dat
111

333

途中で空行できてしまう。

空行できないようにするには、こうすればよい。

$ sed '/222/d' hoge.dat
111
333

ちなみに、空行を削除する場合は、以下のようにする。

~$ sed '/^ *$/d' hoge.dat
111
222
333
444