sedの使い方 の変更点
Top / sedの使い方
- 追加された行はこの色です。
- 削除された行はこの色です。
- sedの使い方 へ行く。
- sedの使い方 の差分を削除
*sedの使い方 [#je1c874a] ''sed''は文字列置換をしてくれるコマンドです。 使い方は至って簡単。正規表現を使わなければ笑 sed 's/置換対象文字列/置換後文字列/' sed は各行に対して、最初に見付かった文字列しか変換を行わない。 対象全部を置換したい場合は、最後に「''g''」をつけます。 sed 's/置換対象文字列/置換後文字列/g' 実行例は以下の通り # date "+%H:%M:%S" 17:45:20 # # date "+%H:%M:%S" | sed 's/:/./' ① 17.45:20 # # date "+%H:%M:%S" | sed 's/:/./g' ② 17.45.20 # # date "+%H:%M:%S" | sed 's/://g' ③ 174520 # 実行例の説明 -①:gをつけない場合、パターンにマッチした最初の文字列「:」のみを「.」に置換 -②:gをつけた場合、パターンにマッチしたすべての文字列「:」を「.」に置換 -③:置換後文字列を指定しなかった場合、パターンにマッチした文字列「:」を削除 へー、簡単。 ***リンク [#vccba018] このサイトをみて使ってみました。 -[[UNIXの部屋 コマンド検索: sed:http://x68000.q-e-d.net/~68user/unix/pickup?sed]] -http://www.jp.freebsd.org/cgi/mroff.cgi?sect=1&cmd=&lc=1&subdir=man&dir=jpman-6.0.0/man&man=sed -http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE -http://www.edu.ics.saitama-u.ac.jp/~j0114ky/first/html_enshu/9.3.html -http://www.kabipan.com/computer/sed/index.html ***サンプル [#cc442b93] 本のタイトルの第~巻を除去する正規化処理 [root@localhost tmp]# cat test.txt 坂の上の雲第1巻 坂の上の雲第12巻 [root@localhost tmp]# cat test.txt | | sed s/第[0-9]巻//g 坂の上の雲 坂の上の雲第12巻 [root@localhost tmp]# cat test.txt | sed s/第[0-9]*巻//g 坂の上の雲 坂の上の雲 *** サンプル2 改行を含むXMLの値を取り出す [#dd0bbb17] こんなファイルがあります。 <resumptionToken completeListSize="10505" cursor=""> 2010-12-08/2010-12-15/zassaku/dcndl_porta/R000000004-I000897285 </resumptionToken> これを、こんな感じでsedすると sed -e '/cursor=\"\">/N;s/\n//' test.xml | grep cursor | sed -e 's/.*cursor=\"\">//;s/\s//g' こんな感じになります。 2010-12-08/2010-12-15/zassaku/dcndl_porta/R000000004-I000897285 *** サンプル3 XMLで対象のタグの値を抽出する [#xd43cb93] XMLから、最初に出現する<repository_no>タグの値を出力する。 head -1 x* | sed -n -e 's/.*<repository_no>\(.*\)<\/repository_no>.*/\1/p' *** サンプル4 指定した行数を削除する [#l9723423] 指定した行数を削除します。 例えば、test.txtの1行目から14行目までを削除します。 sed '1,14d' test.txt *** サンプル5 正規表現のパターンで、途中のパターンだけOR条件 [#we962b38] たとえば、以下のようなログがあります。 # head -3 test.log 2011-06-01 10:56:15,MOBILE,坂本龍馬,commit=検索&s=坂本龍馬,1573,0 2011-06-01 22:13:10,MOBILE,冠木健,commit=検索&s=冠木健,1,0 2011-06-01 23:20:42,PC,麻実れい,commit=検索&s=麻実れい,34,0 このログの3項目目だけほしい場合は、awkで取り出せます。 # head -3 test.log | awk -F, '{print $3}' 坂本龍馬 冠木健 麻実れい これをsedで取り出す場合、以下のような正規表現で取り出せます。 # head -3 test.log | sed -e 's/^[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\},\(PC\|MOBILE\\),\([^,]*\),.*/\2/' 坂本龍馬 冠木健 麻実れい この場合はawkで取り出せるけど、awkでうまくはまらない時はこんなやり方もできるかな、と。 ■ちょっとだけ解説 最初の日付のパターンは同一で、 ^[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\} そのあとのPC/MOBILEはどちらかのパターンがマッチして、 \(PC\|MOBILE\\) ほしいのはその次の「,」までなので、「,」以外の文字でマッチさせて \([^,]*\) 「,」以降はいらないので ,.* でマッチさせて、2番目のパターンスペースを出力すればOK /\2/' って感じです。 間違ってたら指摘してほしいっすw ***サンプル6 ある行数の内容を置き換える [#h9df7d3f] こんなファイルがあるとします。 aaaaa bbbbb ccccc dddd eee #TARGET_URL=http://111.222.333.444/ TARGET_URL=http://55.66.77.88.com/ このファイルのTARGET_URLを別なURLに書き換えたい場合、こんな感じでできます。 sed -i 10c\TARGET_URL=http://test.com/ test.txt ※「-i」オプションで、ファイルの内容を書き換えられます。&br; ※「-i」ではなくリダイレクトすると、元のファイルが消えちゃいますのでご注意をw ***apacheのアクセスログからリファラーだけ取り出す。 [#t8ca97f2] customlogの出力仕様によりますが、東方のログの場合、全体の項目としては8項目目、""(ダブルクオート)でくくられている項目としては2項目目がリファラーとなる場合のサンプルです。 sed -e 's/.*"\(.*\)".*"\(.*\)".*"\(.*\)".*/\2/g' accesslog かなり強引wですが、とりあえず取れましたw