おまいら! sed の使い方教えて下さいm(_ _)m /bbb$/{ N s/\n// } でどう? マッチ文字列や置換文字列に \n が使えるかどうかは環境によるので お前さんがどういうところで使っているかを書かなければ答えようがない。
132 :
login:Penguin :2008/11/09(日) 22:38:03 ID:iboFIZ94
>「Error」がある行に,「### Check Line ###」という新しい行を追加する >$ $ sed -e "/Error/i #### Check Line ###" source.txt ↑の構文なのですが、「新しい行を追加する」のではなく、 行の入れ替えを行う方法は無いでしょうか?
>>132 入れ替えって何と何を入れ替えるの?
#### の行を先に出力したいってこと?
134 :
login:Penguin :2008/11/10(月) 05:23:57 ID:Vv2a12Zc
>>133 例えば、以下のようなテキストがあった場合
111
222
Error 333
444
555
「Error」がある行に,「### Check Line ###」という行に入れ替えたいです。
以下のようなイメージです。
111
222
### Check Line ###
444
555
iじゃなくてc使う
136 :
login:Penguin :2008/11/11(火) 21:48:17 ID:DQj2Ej4A
137 :
login:Penguin :2008/11/15(土) 16:52:59 ID:FFNCNb8R
ナイスなスレだな
なぜawkを使わない?
139 :
login:Penguin :2008/12/03(水) 01:46:50 ID:O9/K8qme
下記のtest.datから、 [1が出現してから3が出現するまでの行]はアドレス範囲を使えば簡単に取得できますが $ sed -n -e '/^1/,/^3/p' test.dat [1が出現してから3が出現する前の行]を取得するにはどうやるのでしょうか? $ sed -n -e '/^1/,/^3/p' test.dat | sed -e '$d' でもいいのですが、1回のsedで済ますにはどうすればよいでしょう? $ cat >test.dat 0 1 2 3 4 5 ^D
140 :
login:Penguin :2008/12/03(水) 02:53:15 ID:1xcvKxcT
>>139 sed -ne '/1/,/3/{/3/q; p'
141 :
139 :2008/12/03(水) 08:40:11 ID:O9/K8qme
>>140 こういう時にqを使うんだ。
物凄く恥ずかしながら、目から鱗状態です。
2週間の間、何度も思い出しては考えても分からなかったので質問してみた。
ありがとう。
147 :
login:Penguin :2010/06/01(火) 16:15:16 ID:8+L/+i95
i=`echo $i|sed -e 's/^\([^ ]*\)\/$/\1/p' -e d` スクリプト中のこの1文の意味が良く分かりません。 どういう処理をしているのか教えていただけないでしょうか。
(^\^)
(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;) (^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;) (^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;) (^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;) (^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)
だれもイナイですね。 cueシートに埋め込まれたFILE名に含まれるスペースをアンダースコアに置換しました。 かなり強引です。はじめてsedを使いました。もっと賢いやり方を教えてもらえれば幸いです。 /^FILE /{s/ /_/g;s/_WAVE/ WAVE/;s/FILE_/FILE /}
>>151 >だれもイナイですね。
枯れてるから特に話題も無いだけ。
まともに質問する気があるなら詳細条件書きなよ。
音楽用のcueシートがあります。
http://foobar2000.xrea.jp/index.php?foobar2000%E3%81%A8cue%E3%82%B7%E3%83%BC%E3%83%88 Tipsのような内容なのです。
FILE "高橋幸宏 - ARE YOU RECEIVING ME.wav" WAVE
TRACK 01 AUDIO
TITLE "Are You Receiving Me?"
PERFORMER "高橋幸宏"
INDEX 01 00:00:00
FILE "坂本龍一 - UNDO #1.wav" WAVE
TRACK 01 AUDIO
TITLE "Undo #1"
PERFORMER "坂本龍一"
INDEX 01 00:00:00
上記のFILEの"で括られた中のスペースをアンダースコアに置換したいのです。
>151 ではFILEの行にのスペースに対して一度すべてアンダースコアにしてます。
するとFILE_と_WAVEとなりるので、あとでこの2つに対してアンダースコアをスペースに戻しました。
本来ならばFILEを探した後、"を探し、その後"が出てくるまで スペースをアンダースコアに置換するのが良いのでしょうが、難しくて私にはムリです。 で、上記の案で逃げました。
「FILE」で始まる行のダブルクォートで括られた文字列の中のスペースのみを「_」に置換したいって事? なら、その方法が現実解だと思うよ。 行の特定の範囲だけを対象にして置換をかけるってのはsedだけだと難しいんじゃないかな。 少なくとも俺には無理なので、sedマスターの降臨を待つしかない。
そうですか。ありがとうございました。
/^FILE "\(.*\)" WAVE/{s//\1/;y/ /_/;s/.*/FILE "&" WAVE/} とかすればよいのでは? まぁ、同じく置換が3回入るので効率はあまり変わりませんが...
正道だと、こうなるのですね。ありがとうございます。
ファイルの最後5行を削除する例としてネットで以下を見つけたのですが、 sed -e '$-4,$d' file 現在使用中のCentOS環境ではGNU sed 4.1.5版で以下のようなエラーが表示されてしまいます。 sed: -e 表現 #1, 文字数 2: 未知のコマンドです: 「-」 GNUサイトから4.2をダウンロードしてみましたが、やっぱりダメで そもそも上記の例がなんのsed(?)で実現したものなのかもわからないのですが…。 実際にやりたかったのはファイルの最後n行だけを対象に置換処理をすることで sed -e '$-4,$s/hoge/piyo/' のようにしてみましたが当然ダメでした。 事前にwc -lで行数を取得し、exprで-4する方法と組み合わせるなどすれば 範囲を特定することもできると思いますが、 sedだけで完結できる方法はないでしょうか?
160 :
login:Penguin :2011/09/22(木) 12:25:27.36 ID:KTYpcKqF
>>159 こんなに下がっているスレで質問するときは上げた方がいい。誰にも気が付かれないかも知れない。
それ本当にsedのスクリプト?自分にはedのスクリプトに見えるが、それを見つけたページが分からないと何とも。
分かってると思うけど、sedは一行ずつ順番に処理していくから、後戻りは出来ないし事前に最終行も分からない。
だから、工夫が必要で下のようになる。分かりやすく汎用的に書くならsedスクリプトを書くしかないね。
sed '1{N;N;N;N};$!{P;N;D};s/hoge/piyo/g' file
sed '1{x;d};2,4{H;d};5{x;G};$!{P;N;D};s/hoge/piyo/g' file
でもこれは、嫌だな。スクリプトで書くと分かり易いんだけど…
tac使っていいのなら、tac | sed '1,5s/hoge/piyo/' | tacって書けるけど遅いだろうね。
161 :
159 :2011/09/22(木) 14:33:51.94 ID:IWU2+wB3
>>160 返信ありがとうございます。m(_ _)m
2chビューアのデフォルトに慣れていたせいで上げ忘れました(^^;
ネットで見かけたサンプルはGoogleで
「sed (最終|最後)*行 削除」を検索すればいくつか見つかると思いますが
OSやsedバージョンまでは書かれていないのでその辺がなんとも…。
sedのパターンスペースは使ったことがなかったので
ちょっと勉強してみたいと思いますが、
他人(未来の自分)が見ても理解できないかもしれませんね…
>>161 それで出たわ。「"sed -e '$-3,$d' file"」でググると出るわ出るわ…
POSIXの規格読むと分かるけど、sedのアドレスにそんな指定方法はないし、
そもそも仕組み上そんな指定ができる訳がない。(そういう実装だとsedの良さがなくなる)
でも、ちょっとコマンド叩けば直ぐ試せるのに、ここまで間違った記述が蔓延したのは疑問。
気になって調べたら、どうも「入門UNIXシェルプログラミング 改訂第2版」が犯人。
正誤表に訂正あり。(参考:
ttp://www.sbcr.jp/support/8429.html )
さらに、発売日以前に絞ってググったら、どっかの大学生がコピペしたページのみヒット。
コピー元は2003年まではあったようだから、つまり
間違った記述の1ページ → それを検証せず本に記載 → それをさらに検証せずにネットにコピペ
という流れで嘘情報が増大していったようだ。試せば出来ないことなんて瞬時に分かるのに…
ネット上の出展不明、再現もしくは検証不能情報は信用するなってことだな。
ところで、元レスの「"sed -e '$-4,$d' file"」で検索をかけても一件もヒットしなかったぞ。
わざわざ書き換えて転載されると検索にもでなくて困るよ(´・ω・`)
上の例に加えてもう一つ。一番分かりやすく書くとこうかな。 sed ': loop 1,4 { N b loop } $! { P N D } s/hoge/piyo/g' file こう書くと改行が入ってワンライナーにはつらいがしかたない。 ついでに言うとsedは普通パターンスペースしか使わない。使ったことないってのは変だ。 上のもパターンスペースしか使ってない。 POSIXにはないけど、GNU textutils(tacもそうだった)ならこんなのもいけるはず。 { head -n -5 file && tail -n 5 | sed 's/hoge/piyo/'; }
>>159 最後の5行だけ置換対象とする
#!/bin/sh
sed "$(($(sed -n '$=' file)-5+1)),$ s/hoge/piyo/" file
sedしか使ってないよ〜
/bin/shのArithmetic Expansionは使ってるけど
165 :
164 :2011/09/23(金) 14:50:32.68 ID:vKgog6QO
あ、fileは5行以上って前提 そこは工夫しないと
166 :
login:Penguin :2012/06/07(木) 10:18:04.20 ID:srWmu+na
1行目の後にtestを入れるつもりがエラーになります。 >cat text.txt| sed -e '1atest' sed: 1: "1atest ": command a expects \ followed by text シェルの中で、置換と追加をやりたので、実際はこうなってます。 sed -e 's/Before/After/g' \ -e '1iコメント' \ -e '12iコメント' \ 元ファイル > 新ファイル 行追加だけエラーになるのですが、 どこがおかしいのでしょうか?
>>166 質問の仕方から勉強すべき
どういう状態で何をするとどうなるのか
誰でも再現できるような説明を書くべき
sed使うくらいならperl使った方が楽。
>>168 perl使いってマジで気持ち悪い
どんな場面でも無理やりperlを使おうとする
シンプルなコマンドの組み合わせで機能を実現できたり、
よりモダンな言語やスクリプトで簡単に実現できるのに
強引なまでにperlにこだわる
(emacs使いもその傾向有り)
殆ど病気だわ
常識で考えて、sedのバッファやりくりでパズルするくらいならperlのほうが楽だろ。
>170 徒歩5分の距離にある目的地と徒歩1時間のそれ、そこに行くために歩いても自転車をこいでも自動車に乗ってもその人の自由でしょ。 常に特定の手段しか使わない人に関わりたくなければその人から遠ざかっていればいいじゃない。
173 :
login:Penguin :2012/08/30(木) 20:41:42.25 ID:kbI/S7Ao
スレ違いで申し訳ないんっですが、join コマンドの使い方について教えてください。 下記のような「時間,数値」を持ったcsvファイルがあり、時間をキーにして結合したいと思っています。 コマンドを調べたところ「join」(もしくはpaste)コマンドがぴったりだったので join aaa.csv bbb.csv とコマンドを実行したのですが、期待結果が返ってきません。 ファイルの内容と期待結果は以下です。 aaa.csv ----------------------- 23:00:00,4.12 23:05:00,17.07 23:10:00,2.04 ----------------------- bbb.csv ----------------------- 23:00:00,4.35 23:05:00,8.39 23:10:00,2.07 ----------------------- ジョインした期待結果 ----------------------- 23:00:00,4.12,4.35 23:05:00,17.07,8.39 23:10:00,2.04,2.07 ---------------------- どうしたら期待結果のようになるでしょうか?
スレ違いだとわかってるなら適切なスレで聞いてください。
catじゃだめなのか…
176 :
login:Penguin :2012/08/30(木) 21:48:28.92 ID:kbI/S7Ao
>175 catコマンドで横に結合できるのでしょうか?><
>>173 sed スレなんだから、sed を1つでも使ってやれよ!w
179 :
login:Penguin :2013/11/04(月) 18:07:02.93 ID:p0Jz6Hdm
ちーばくん ヘ__/ ̄ ̄ ̄\ \ノ (・) ヽ__) \_ノ 丿 (ノー、 | ノ ヽ / | | | (_ノ \ / ) / (_ノ
180 :
login:Penguin :
2015/02/06(金) 13:20:41.40 ID:/TKErNtd >>173 もう見てはいないだろうが、 -t でちゃんとセパレータを設定する必要がある。