- 1 名前:名無しさん@お腹いっぱい。 [04/05/28 16:56]
- sedスレッド
- 300 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/08/29(金) 17:04:29 ]
- 01101,"0600031","ホッカイドウ","サッポロシチュウオウク","キタ1ジョウヒガシ","北海道","札幌市中央区","北一条東",0
↓ 01101,"0600031","ホッカイドウ","サッポロシチュウオウク","キタ1ジョウヒガシ","北海道","札幌市中央区","北一条東",0 この第5フィールドの半角英数だけ(2個有る場合もあり)全角にしたいのですが どのようにsedを作ればいいでしょうか?
- 301 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/08/29(金) 17:07:35 ]
- >どのようにsedを作れば
釣りポイントはここですか?
- 302 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/08/29(金) 21:15:26 ]
- その形式は、郵便屋の郵便番号データだろ。
エクセルか何かの一覧表をcsvに落としただけの代物だから そのままでは役に立たないよ。 そのままDBに格納し、専用プログラムで変換かけて正規化してる。
- 303 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/08(水) 23:13:50 ]
- aaa.hoge
bbb.hage ccc.foge とかいう文字列があって、*.hoge以外にマッチする正規表現って出来るのでしょうか?
- 304 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/09(木) 00:18:38 ]
- スレ違い。正規表現スレに池
- 305 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/09(木) 21:57:14 ]
- >>303
その文を素直に読むと、当該文字列にだけはマッチしない 正規表現と読めるが、書き込み子の心情を忖度すると、 sed 's/[a-c]{3}\.hoge/==matched==/' って事かな? まあ、[a-c]* でも、(aaa|bbb|ccc) でも、[[:alpha:]]* でも、 マッチする表現は無数に有るけど、(・・に、だけマッチする) を、求めているなら、そもそも*.hoge って見当外れだし、 要するに、何が知りたいのか良く分からん。
- 306 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/10(金) 17:29:18 ]
- >>305
> >>303 なるほど、ありがとうございます。
- 307 名前:名無しさん@お腹いっぱい。 [2008/10/27(月) 23:08:07 ]
- ファイル内の、スペース+改行をスペースのみに置換したいのですが、
どのように記述すればよいのでしょうか。 データ数が数十万行あるため、ファイルを全部読み込んでから 置換する方法では、容量がオーバーしてしまいました。
- 308 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/27(月) 23:26:18 ]
- >>307
Perl か何かで書いちゃった方が早いんじゃね?
- 309 名前:名無しさん@お腹いっぱい。 [2008/10/27(月) 23:29:29 ]
- >>308
環境上、Perlを使用することができないんです。 sedでは難しいでしょうか。
- 310 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/28(火) 00:02:57 ]
- 環境によって違うと思うけど普通の書き方じゃダメなのか?
s/ \n/ /g
- 311 名前:名無しさん@お腹いっぱい。 [2008/10/28(火) 00:07:58 ]
- >>310
自分の環境では、\nが認識されませんでした。
- 312 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/28(火) 02:53:50 ]
- >>311
OSの具体的な名前とかは出さないのな。 s/\ / /g では?
- 313 名前:312 mailto:sage [2008/10/28(火) 02:56:53 ]
- すまん。勘違いした。
sed はPerlと違って、入力したときに改行を取り除いてからパターンスペースに送るから、 そこで改行探しても見つかりっこない。 んで、出力時に自動的に改行は付くし、これを抑制する手段はない。 せめて awk使っとけ。Perlなくてもawkはあるだろ。
- 314 名前:312 mailto:sage [2008/10/28(火) 02:58:41 ]
- すまん勘違いしてた。
sedはPerlと違って入力時に改行を取り除くから、置換時に改行探したって見つかりっこない。 Nとかで次の入力を読んでくれば間に挟まるけど。
- 315 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/28(火) 03:19:55 ]
- おまえらマルチに親切だな
- 316 名前:名無しさん@お腹いっぱい。 [2008/10/28(火) 07:09:08 ]
- ありがとうございました。
sedでは難しそうですね。別の方法を探してみます。
- 317 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/28(火) 07:21:00 ]
- 微妙に変えてあるとこがうまいな。
- 318 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/28(火) 22:44:37 ]
- tr -d '\n'
- 319 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/28(火) 22:47:24 ]
- 良く読んで赤面しろw
>>318 >>307 「スペース+改行をスペースのみに置換したい」
- 320 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/10/28(火) 22:54:10 ]
- >>307
sed ' :again / $/{ N s/?n// b again } '
- 321 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/16(月) 16:23:57 ]
- sedの公式ホームページってないのでしょうか
awkは一応gawkがあって一応開発も続いているようですが sedはどのような状態なのでしょうか? いつまでたっても最短マッチを搭載しない理由もお教えねがいます。
- 322 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/16(月) 23:57:10 ]
- そういう機能を追加すると、既存のスクリプトが動作しなくなるから。
ポータビリティを失ってまで実装する必要がない。(それこそ、perlでもawkでも使えばいい)
- 323 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/17(火) 09:03:12 ]
- なるほど、参考になりました。
もし開発に参加できるなら参加したいと思っていたのですが そのような理由ならそういったときはperlやawkに頼る事にします。
- 324 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/18(水) 09:33:00 ]
- >>322
sedに正規表現perl互換モードを搭載すればいいだけなのにね
- 325 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/19(木) 18:21:24 ]
- GNU sedの-r みたいなので、perlモードがあればいいね。
- 326 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/19(木) 19:39:12 ]
- >>321
gnu sed 拡張している人たちがいるからそのあたりに乗ってみれば?
- 327 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/19(木) 20:18:08 ]
- onigsedじゃダメなのか?
つーか、perl -pe でいいじゃん。
- 328 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/24(火) 17:21:46 ]
- >>321
GNU sed なら www.gnu.org/software/sed/
- 329 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/02/27(金) 16:21:29 ]
- >>327
今度はsed互換ではないという
- 330 名前:名無しさん@お腹いっぱい。 [2009/06/29(月) 20:49:52 ]
- 質問させてください。
sedでホワイトスペースを解除または増やす方法ってあるのでしょうか?
- 331 名前:名無しさん@お腹いっぱい。 [2009/06/29(月) 20:52:21 ]
- 間違い。ホールドスペースです。
- 332 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/06/29(月) 21:16:24 ]
- 以下ホワイトベース禁止
- 333 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/06/29(月) 22:40:10 ]
- 白兵戦になるぞ!
- 334 名前:名無しさん@お腹いっぱい。 [2009/07/03(金) 03:11:56 ]
- sedで、
/pattern/r file ってするとマッチした行の次にfileの内容が出力されますが、 その行の前に出力する方法はないでしょうか? ちなみにマッチする行は1個しかありません。
- 335 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/03(金) 23:31:09 ]
- sed -n -e '/pattern/r file' -e p
- 336 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/03(金) 23:49:16 ]
- ごめん、ダメだった。こっちで。
sed -n -e 'x;p;g' -e '/pattern/r file' 1行目の空行は無視して
- 337 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/03(金) 23:53:59 ]
- 1行めの空白はもう1段 | sed 1d で消せるけど……
入力の最後の1行出てなくない?
- 338 名前:336 mailto:sage [2009/07/04(土) 00:17:53 ]
- 出てなかった。
sed -n -e 'x;p;g' -e '/pattern/r file' -e '$p' という感じで最後の行を出力することは出来るけど patternが最後の行の場合だけ、fileの内容が次行に出ちゃう。 自分はギブアップ
- 339 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/04(土) 12:34:06 ]
- いろいろありがとうございます。
sed 1個では難しいようですね。 patternより前とpattern以後に別けて、 間にfileをcatするしかないのかもしれません。
- 340 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/04(土) 18:04:47 ]
- sed 2個ならなんとか
sed -e '$aEND' | sed -e ' $d /pattern/{ r file N } ${ P d }'
- 341 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/24(木) 17:28:09 ]
- >>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 ]
- >>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 ]
- >>341
sed -e "1s/^\(...\)^B/\1$(printf '\03')/" でできんかね。^BはC-v C-b入力できるはず。
- 344 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/09/25(金) 10:46:05 ]
- >>343
最初の3バイトに改行文字がない保証がないから一般的にはだめそうだな。 やっぱ行指向のsedでバイナリファイルを操作するのは無理があると思う。
- 345 名前:341 mailto:sage [2009/09/25(金) 12:31:36 ]
- \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 ]
- >>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 ]
- ひとつ、お聞きいたします。
Nコマンドって、最後の行で次行が読めない場合、何もせず終了、 のはずですよね。すると、 sed 'sed ':l;N;bl' <file> とすると何も出力されないんじゃないかと思うんですが、 私の使っているGNU sed 4.1.5版だと<file>の全部を出力してしまいます。 つまり、「何もせず終了」じゃなくて、「デフォルト出力して終了」 になっているように思われるわけですが、これは、どうなんでしょうか。
- 348 名前:名無しさん@お腹いっぱい。 mailto:sage [2010/02/20(土) 23:16:51 ]
- >>347
infoに書いてありました。
- 349 名前:名無しさん@お腹いっぱい。 [2010/07/01(木) 23:39:24 ]
- なるほど
|

|