1 名前:名無しさん@お腹いっぱい。 [04/05/28 16:56.net] sedスレッド
291 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/07(月) 08:36:46 .net] n文字目のxとは、 行頭から(n-1)個の文字のあとに出現するx のことか? 行頭からn回目に出現するx のことか?
292 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/07(月) 09:42:38 .net] >>291 参考までに両方ともお願い
293 名前:名無しさん@お腹いっぱい。 [2008/07/07(月) 12:09:14 .net] 前者です
294 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/07(月) 13:30:25 .net] >>291 後者ですが、念のため両者の場合について教えてください
295 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/07(月) 21:50:58 .net] 行頭から4文字目のxをyに echo xxxxxxxxxx | sed 's/^¥(...¥)x/¥1y/' 行頭から4個目のxをyに echo x-x-x-x-x | sed 's/¥([^x]*x[^x]*x[^x]*x[^x]*¥)x/¥1y/' とかとか? 4を変数にするのは漏れには粍
296 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/07(月) 23:32:28 .net] ()ってのは条件になるん?
297 名前:290 293 [2008/07/08(火) 10:30:38 .net] ありがとうございます 確かに.×4みたいに表現できたらかっこいいですが これで文句なしです!
298 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 11:11:36 .net] >>297 ×4は無理っぽい。 echo x-x-x-x-x- | sed 's/\(\([^x]*x\)\{3\}[^x]*\)x/\1y/'
299 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 11:49:57 .net] >>298 Solarisのsedじゃ動かんな。
300 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/08/29(金) 17:04:29 .net] 01101,"0600031","ホッカイドウ","サッポロシチュウオウク","キタ1ジョウヒガシ","北海道","札幌市中央区","北一条東",0 ↓ 01101,"0600031","ホッカイドウ","サッポロシチュウオウク","キタ1ジョウヒガシ","北海道","札幌市中央区","北一条東",0 この第5フィールドの半角英数だけ(2個有る場合もあり)全角にしたいのですが どのようにsedを作ればいいでしょうか?
301 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/08/29(金) 17:07:35 .net] >どのようにsedを作れば 釣りポイントはここですか?
302 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/08/29(金) 21:15:26 .net] その形式は、郵便屋の郵便番号データだろ。 エクセルか何かの一覧表をcsvに落としただけの代物だから そのままでは役に立たないよ。 そのままDBに格納し、専用プログラムで変換かけて正規化してる。
303 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/08(水) 23:13:50 .net] aaa.hoge bbb.hage ccc.foge とかいう文字列があって、*.hoge以外にマッチする正規表現って出来るのでしょうか?
304 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/09(木) 00:18:38 .net] スレ違い。正規表現スレに池
305 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/09(木) 21:57:14 .net] >>303 その文を素直に読むと、当該文字列にだけはマッチしない 正規表現と読めるが、書き込み子の心情を忖度すると、 sed 's/[a-c]{3}\.hoge/==matched==/' って事かな? まあ、[a-c]* でも、(aaa|bbb|ccc) でも、[[:alpha:]]* でも、 マッチする表現は無数に有るけど、(・・に、だけマッチする) を、求めているなら、そもそも*.hoge って見当外れだし、 要するに、何が知りたいのか良く分からん。
306 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/10(金) 17:29:18 .net] >>305 > >>303 なるほど、ありがとうございます。
307 名前:名無しさん@お腹いっぱい。 [2008/10/27(月) 23:08:07 .net] ファイル内の、スペース+改行をスペースのみに置換したいのですが、 どのように記述すればよいのでしょうか。 データ数が数十万行あるため、ファイルを全部読み込んでから 置換する方法では、容量がオーバーしてしまいました。
308 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/27(月) 23:26:18 .net] >>307 Perl か何かで書いちゃった方が早いんじゃね?
309 名前:名無しさん@お腹いっぱい。 [2008/10/27(月) 23:29:29 .net] >>308 環境上、Perlを使用することができないんです。 sedでは難しいでしょうか。
310 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/28(火) 00:02:57 .net] 環境によって違うと思うけど普通の書き方じゃダメなのか? s/ \n/ /g
311 名前:名無しさん@お腹いっぱい。 [2008/10/28(火) 00:07:58 .net] >>310 自分の環境では、\nが認識されませんでした。
312 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/28(火) 02:53:50 .net] >>311 OSの具体的な名前とかは出さないのな。 s/\ / /g では?
313 名前:312 mailto:sage [2008/10/28(火) 02:56:53 .net] すまん。勘違いした。 sed はPerlと違って、入力したときに改行を取り除いてからパターンスペースに送るから、 そこで改行探しても見つかりっこない。 んで、出力時に自動的に改行は付くし、これを抑制する手段はない。 せめて awk使っとけ。Perlなくてもawkはあるだろ。
314 名前:312 mailto:sage [2008/10/28(火) 02:58:41 .net] すまん勘違いしてた。 sedはPerlと違って入力時に改行を取り除くから、置換時に改行探したって見つかりっこない。 Nとかで次の入力を読んでくれば間に挟まるけど。
315 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/28(火) 03:19:55 .net] おまえらマルチに親切だな
316 名前:名無しさん@お腹いっぱい。 [2008/10/28(火) 07:09:08 .net] ありがとうございました。 sedでは難しそうですね。別の方法を探してみます。
317 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/28(火) 07:21:00 .net] 微妙に変えてあるとこがうまいな。
318 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/28(火) 22:44:37 .net] tr -d '\n'
319 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/28(火) 22:47:24 .net] 良く読んで赤面しろw >>318 >>307 「スペース+改行をスペースのみに置換したい」
320 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/28(火) 22:54:10 .net] >>307 sed ' :again / $/{ N s/?n// b again } '
321 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/16(月) 16:23:57 .net] sedの公式ホームページってないのでしょうか awkは一応gawkがあって一応開発も続いているようですが sedはどのような状態なのでしょうか? いつまでたっても最短マッチを搭載しない理由もお教えねがいます。
322 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/16(月) 23:57:10 .net] そういう機能を追加すると、既存のスクリプトが動作しなくなるから。 ポータビリティを失ってまで実装する必要がない。(それこそ、perlでもawkでも使えばいい)
323 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/17(火) 09:03:12 .net] なるほど、参考になりました。 もし開発に参加できるなら参加したいと思っていたのですが そのような理由ならそういったときはperlやawkに頼る事にします。
324 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/18(水) 09:33:00 .net] >>322 sedに正規表現perl互換モードを搭載すればいいだけなのにね
325 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/19(木) 18:21:24 .net] GNU sedの-r みたいなので、perlモードがあればいいね。
326 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/19(木) 19:39:12 .net] >>321 gnu sed 拡張している人たちがいるからそのあたりに乗ってみれば?
327 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/19(木) 20:18:08 .net] onigsedじゃダメなのか? つーか、perl -pe でいいじゃん。
328 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/24(火) 17:21:46 .net] >>321 GNU sed なら www.gnu.org/software/sed/
329 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/27(金) 16:21:29 .net] >>327 今度はsed互換ではないという
330 名前:名無しさん@お腹いっぱい。 [2009/06/29(月) 20:49:52 .net] 質問させてください。 sedでホワイトスペースを解除または増やす方法ってあるのでしょうか?
331 名前:名無しさん@お腹いっぱい。 [2009/06/29(月) 20:52:21 .net] 間違い。ホールドスペースです。
332 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/06/29(月) 21:16:24 .net] 以下ホワイトベース禁止
333 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/06/29(月) 22:40:10 .net] 白兵戦になるぞ!
334 名前:名無しさん@お腹いっぱい。 [2009/07/03(金) 03:11:56 .net] sedで、 /pattern/r file ってするとマッチした行の次にfileの内容が出力されますが、 その行の前に出力する方法はないでしょうか? ちなみにマッチする行は1個しかありません。
335 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/03(金) 23:31:09 .net] sed -n -e '/pattern/r file' -e p
336 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/03(金) 23:49:16 .net] ごめん、ダメだった。こっちで。 sed -n -e 'x;p;g' -e '/pattern/r file' 1行目の空行は無視して
337 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/03(金) 23:53:59 .net] 1行めの空白はもう1段 | sed 1d で消せるけど…… 入力の最後の1行出てなくない?
338 名前:336 mailto:sage [2009/07/04(土) 00:17:53 .net] 出てなかった。 sed -n -e 'x;p;g' -e '/pattern/r file' -e '$p' という感じで最後の行を出力することは出来るけど patternが最後の行の場合だけ、fileの内容が次行に出ちゃう。 自分はギブアップ
339 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/04(土) 12:34:06 .net] いろいろありがとうございます。 sed 1個では難しいようですね。 patternより前とpattern以後に別けて、 間にfileをcatするしかないのかもしれません。
340 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/04(土) 18:04:47 .net] sed 2個ならなんとか sed -e '$aEND' | sed -e ' $d /pattern/{ r file N } ${ P d }'
341 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/24(木) 17:28:09 .net] >>295 の例に似てますが、 バイナリファイル(1行めの)4バイトめを ASCII 文字 0x02 -> 0x03 に 変更するにはどうすればいいでしょう? # sed -e '1s/^\(...\)\x02/\1\x03/' in > out ではだめでした。 試した環境は FreeBSD 7.2 です。
342 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/24(木) 18:02:08 .net] >>341 (dd bs=3 count=1; dd bs=1 count=1 of=/dev/null; printf '¥003'; cat) < in > out
343 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/25(金) 10:26:24 .net] >>341 sed -e "1s/^\(...\)^B/\1$(printf '\03')/" でできんかね。^BはC-v C-b入力できるはず。
344 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/25(金) 10:46:05 .net] >>343 最初の3バイトに改行文字がない保証がないから一般的にはだめそうだな。 やっぱ行指向のsedでバイナリファイルを操作するのは無理があると思う。
345 名前:341 mailto:sage [2009/09/25(金) 12:31:36 .net] \x02 などは GNU sed の拡張仕様でした。 # pkg_add -r gsed # rehash # gsed -e '1s/^\(...\)\x02/\1\x03/' in > out でできました。
346 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/25(金) 12:37:49 .net] >>342-344 ありがとうございます。 >>342 の dd を使った方法は大変参考になります。 あと、 # sed -e '1s/^\(...\)^V^B/\1^V^C/' in > out でもできました。 ^V^B は <Ctrl>V<Ctrl>B 、 ^V^C は <Ctrl>V<Ctrl>C です。
347 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/02/20(土) 21:42:41 .net] ひとつ、お聞きいたします。 Nコマンドって、最後の行で次行が読めない場合、何もせず終了、 のはずですよね。すると、 sed 'sed ':l;N;bl' <file> とすると何も出力されないんじゃないかと思うんですが、 私の使っているGNU sed 4.1.5版だと<file>の全部を出力してしまいます。 つまり、「何もせず終了」じゃなくて、「デフォルト出力して終了」 になっているように思われるわけですが、これは、どうなんでしょうか。
348 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/02/20(土) 23:16:51 .net] >>347 infoに書いてありました。
349 名前:名無しさん@お腹いっぱい。 [2010/07/01(木) 23:39:24 .net] なるほど
350 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/08/17(火) 13:08:10 .net] yコマンドで"/"を対象に入れたいんですが出来ないんでしょうか 初歩的ですいません
351 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/08/17(火) 13:23:28 .net] >>350 sed y,abc,ABC, とかできるから、 sed 'y,ab/,ab%,' もできる。
352 名前:350 mailto:sage [2010/08/17(火) 23:26:44 .net] そうか、区切り文字変えられるのsコマンドばかりじゃないんですね。 どうもありがとうございました。
353 名前:初心者 [2010/10/23(土) 20:01:51 .net] sedでシェルすくりぷとの行つなぎバックスラッシューを消して、繋ぐことできますか? perlなら-pe "s/\\\n//g"でできます。 edでも、awkでもできれば、教えていただけませんか?
354 名前:名無しさん@お腹いっぱい。 [2010/10/24(日) 13:40:00 .net] できる
355 名前:初心者 mailto:sage [2010/10/24(日) 21:13:33 .net] できました ありがとう
356 名前:初心者 [2010/10/25(月) 22:07:05 .net] できないようですね、残念です。
357 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/10/26(火) 19:38:19 .net] sed -e ':lbl' -e '/[^\\]$/b' -e 's/\\$//' -e N -e 's/\n//' -e 'b lbl' 置換パターンに\nを許さない場合は sed -e ':lbl' -e '/[^\\]$/b' -e 's/\\$//' -e N -e 's/ //' -e 'b lbl'
358 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/10/28(木) 08:37:34 .net] 踊っているように見えて仕方がない echo "000000$NUM" | sed -e 's/.*\(..\)\(..\)\(..\)/\1\2\3/'
359 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/11/28(日) 18:33:17 .net] sedでファイルのある部分までをファイル1、それ以降をファイル2に出力ってスマートにできませんか? 例えば100行のsample.txtというファイルで、 sed -e "50q" < sample.txt > sample1.txt sed -e "1,50d" < sample.txt > sample2.txt の様にするのは無駄におもえてしまいます。
360 名前:名無しさん@お腹いっぱい。 [2010/11/28(日) 18:39:52 .net] sed -ne '1,50w sample1.txt' -e '51,$w sample2.txt' < sample.txt とか?
361 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/11/28(日) 18:48:58 .net] split -50 sample.txt; mv xaa sample1.txt; mv xab sample2.txt
362 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/11/28(日) 19:52:27 .net] >>360 ,361 ありがとうございました。勉強になります。
363 名前:名無しさん@お腹いっぱい。 [2010/12/22(水) 23:54:50 .net] 入力テキストを 1行目の内容 2行目の内容 2行目の内容 3行目の内容 : 最終-2行目の内容 最終-1行の内容 最終-1行目の内容 最終行の内容 という形(隣り合った行の値を空白で連結する)に変換するにはどう書けば よいでしょうか。 sed -ne '1!p;$!p' と通せば先頭末尾以外の行を2回出力できたので、 これを2行分ずつくっつければ出来そうなのですが…
364 名前:名無しさん@お腹いっぱい。 [2010/12/23(木) 00:03:02 .net] ¥n ってどのsedでも使えるんだっけ? $ seq 1 10 | sed -ne '1!p;$!p' | sed 'N;s/¥n/ /' 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10
365 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/12/23(木) 00:47:03 .net] seq 1 10 | sed -ne '1h;1!{H;x;s/\n/ /;p}'
366 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/12/26(日) 21:44:54 .net] s/seq/jot/
367 名前:名無しさん@お腹いっぱい。 [2011/01/15(土) 11:45:22 .net] unixの基礎概念という本の中に a 21 is 10 this 3 というtest.txtファイルに対して、 sed 's/\(.*\)\( *\)\(.*\)/\3\2\1/' test.txt とすると結果は 21 a 10 is 3 this になると書いてありましたが、実行してみると並びはかわりませんでした。
368 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/01/15(土) 11:49:07 .net] >>367 確かに。それじゃぁ一番左側の .* が、最長一致で行全体に一致しちゃうから、 並びが変わらなくて正解。 悪書の書名晒して。
369 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/01/15(土) 11:50:52 .net] 久野さんらしくないミスだな。 確かに変わらないね。
370 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/01/15(土) 11:51:32 .net] >>367 真中の * の直前のスペース、 スペース2つじゃないの? コピペするとスペースが1つとかになるので注意。
371 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/01/15(土) 11:54:36 .net] これかな? www.amazon.co.jp/dp/4756144772 久野先生の本だけど、そんなのが混ざってるのか。
372 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/01/15(土) 12:01:42 .net] >>371 はいそれです。解説にも 「これはどう読むかというと、『入力行を任意の文字列1と、空白のならび2と、また別の任意の文字列3 にマッチさせ、それ全体を3、2、1の順でつなげたものに置き換える』という意味になる。」と書いてあります。
373 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/01/15(土) 12:06:04 .net] >>372 なら、>>370 の指摘通りで、キミが間違っている。 × sed 's/\(.*\)\( *\)\(.*\)/\3\2\1/' test.txt ○ sed 's/\(.*\)\( *\)\(.*\)/\3\2\1/' test.txt
374 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/01/15(土) 12:10:21 .net] 2chに不慣れな感じ
375 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/01/15(土) 12:11:56 .net] 專ブラなら安価ポップアップでちゃんと表示されるのかな >>373
376 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/01/15(土) 12:14:12 .net] >>372 紙面上に、└┘└┘みたいな感じでスペースの個数は明示してあるの? 明示してないなら紙面が悪いと思うが。
377 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/01/15(土) 12:36:36 .net] >>373 空白2個ならいけるのですか。 >>376 そういう、└┘└┘みたいな感じはなかったです。文字数的にも一文字分の感じ ですし。編集上のミスかもしれませんけど。
378 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/01/15(土) 14:25:37 .net] >>376 > 「これはどう読むかというと、『...、空白のならび2と、... って書いてあるんだろ?
379 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/01/15(土) 14:29:14 .net] >>378 それは、¥2 のこと。「スペース2個」のことじゃないよ。
380 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/01/15(土) 14:31:27 .net] >>378 空白のならび
381 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/01/15(土) 14:34:38 .net] >>378 正規表現を理解してないバカ発見。 任意の文字列 → \1 空白の並び → \2 別の任意の文字列 → \3 と言ってるだけのこと。それとスペース2つ書くのとは意味が違う。
382 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/01/15(土) 14:44:12 .net] むしろhtmlのレンダリングを理解していない
383 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/03/25(金) 20:16:28.23 .net] 任意の文字列の前か後ろの少なくともどちらかは、任意でない特定の文字・文字列(含^$)でないと困ったことになるということですね? 俺も前それで失敗した。
384 名前:名無しさん@お腹いっぱい。 [2011/04/21(木) 06:41:06.41 .net] sedの話題はこっちへ くれぐれもシェルスクリプトスレに書き込まないように!
385 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/04/21(木) 13:17:24.83 .net] >>377 \2,\3がφで全体がマッチ \1に行全体 一つ目が\([^ ]*\)ならよかった。
386 名前: 忍法帖【Lv=38,xxxPT】 【東電 69.2 %】 株価【E】 mailto:sage [2011/04/27(水) 08:53:07.51 .net] AAA BBB=111 CCC=111 この行の111を000に置き換えするのに sed -e 's/BBB=111/BBB=000/' とする以外にもっとスマートな書式を教えてください。 GNU sedです
387 名前:名無しさん@お腹いっぱい。 [2011/04/27(水) 12:11:27.62 .net] >>386 sed -e "s/1/0/g"
388 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/04/27(水) 12:35:36.38 .net] >>386 > sed -e 's/BBB=111/BBB=000/' これじゃ、お題 > この行の111を000に置き換えするのに を満たさない。 矛盾を含む質問に答えることは不可能。
389 名前:386 mailto:sage [2011/04/27(水) 13:29:23.92 .net] >この行の111を000に置き換えするのに この行のBBB=111だけをBBB=000にする書式でした すいません。
390 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/04/27(水) 13:52:24.65 .net] スマートの基準がわからないけど、BBBが二度出現するのが嫌なら sed -e 's/\(BBB\)=111/\1=000/'
391 名前:名無しさん@お腹いっぱい。 mailto:sage [2011/04/27(水) 14:59:23.65 .net] >>386 s/111 /000 / で十分