• ベストアンサー

test.htm の133048行目だけを削除したい

10MBぐらいあるファイル(test.htm) の、133048行目を、単に削除したいのですが、perl script (del.pl等のファイル)で、どのように書くのでしょうか?  awkとかsed とかを昔使った経験がありますが、perlのことをはじめたばかりで、さっぱり解りません. またperl初心者に向く基礎的なことを記したURLがありますでしょうか? またperl以外で、こうすれば、良い、という別手法情報も今後の参考には、ありがたいです、よろしくお願いします.

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.5

> 次に、コマンドラインで実施させる書き方を知りたくなりました 了解、Windowsなんですね。Windowsのシェルはシングルクォートを 理解してくれません。なので、 > c:\>cat test.html | gawk ' NR != 133048 { print } ' は、ダブルクォートに変えて、 c:\>cat test.html | gawk " NR != 133048 { print } " で OK です。 私も、unix と Windows を行ったり来たりしてますので、 良く間違えます (^^;

finetoothcomb
質問者

お礼

成功しました!ありがとうございました!!

finetoothcomb
質問者

補足

皆さんこのたびは各種の方法を教えてくださり、ありがとうございました!他にも簡単な あるいは、おもしろいやり方が、あったらご教示いただけたら幸いです.

その他の回答 (7)

回答No.8

ええと、一応私もPerl以前にsed, awkの人ではあったのですが…。 gawkやnawkならともかく、pureなawkの素朴なところにはほんと、泣かされましたよ。 つうわけで、ちょっと苦しいhead + tail。 C:\> sh -c "head -133047 test.html;tail +133049 test.html" というかだいぶ苦しいですな。sh(bash)とheadとtailがないといけない。 cygwin環境なら、という。 それから、Rubyを出されたらPythonを出さぬわけにはいきますまい。 といっても、あまり知らないのでもっと粋な書き方があるかもしれませんが。 test.pyに #!/usr/local/bin/python import fileinput for line in fileinput.input():  if fileinput.lineno() != 3:   print line, と書いておいて(全角スペースは半角にすること)、 C:\>python test.py test.html うーん、分が悪いな。あとはschemeで…もうお呼びでないですか。 失礼しました。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.7

> > であれば、無理に perl を使わずとも、sed や awk でやってしまえば > > まあおっしゃるとおりですが、Perlでやるのがそれほど無理、無茶なことでも…。 "perl"er にはそう思われちゃうのですが、先に sed や awk を憶えちゃうと perl に移行するのが *おっくう* なのも事実なので… # 少なくとも、私は (^^; つうわけで、sed の場合も。 c:\> sed -e 133048d test.html もう一つおまけに ruby の場合も。 c:\> ruby -pe "next if $. == 133048" test.html ちなみに ruby だと perl とほとんど同じ書き方でもいけます。 c:\> ruby -ne "$. != 133048 and print" test.html

回答No.6

もう答えは出ていて、勝敗は決してますが(笑)、せっかくPerlで、 という最初のお伺いなのに、awkさんでしかまともな答えが出てないのも 哀しいので。 c:\> perl -ne "$. != 133048 and {print}" test.html わざと似せて書いたりして。他にも書き方はあります。 (ただし、ファイルの中身を全部読みこんでspliceを使うのは、巨大な ファイルの場合メモリを大量に消費するので効率が悪いでしょう。お薦め しません) PerlはもともとAwkをもっと強力に!という意図もあったようで、 だからBEGINだのENDだの、ほとんどそっくりに書くことができます。 > であれば、無理に perl を使わずとも、sed や awk でやってしまえば まあおっしゃるとおりですが、Perlでやるのがそれほど無理、無茶なこと でも…。Perlくんは普段いい加減ですがほんとうはやればできるいい子なんです…。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.4

このカテゴリに書き込んでいるということは、その削除をする、ということを CGIでやりたい、ということですよね? であれば、無理に perl を使わずとも、sed や awk でやってしまえば 良いのではないでしょうか? 例えば、awk でやるならば、こんな感じかな? #!/usr/bin/sh cat test.htm | awk ' BEGIN { print "Content-type:text/html\n" } NR != 133048 { print } '

finetoothcomb
質問者

お礼

回答ありがとうございます. 質問が曖昧ですみません. windows98SEのDOS窓で、コマンドラインから実施したい、です. awkとか、sedで、dos のコマンドラインで、べたべたっと書いて実施させる書き方を教えてくださると幸いです. CGIは実は使った経験ありません. --成功したこと-- 上に教えていただいたやり方を参考に、NR != 133048 { print }だけを、delline.awkと別ファイルに作成して、c:\>cat test.html | gawk -f delline.awk としたら成功しました.  --次にやりたくなったこと-- 次に、コマンドラインで実施させる書き方を知りたくなりました. c:\>cat test.html | gawk ' NR != 133048 { print } ' とやると C:\BIN\GAWK.EXE: cmd. line:1: ^ Invalid char ''' in expression というエラーが出てしまいます. よろしくお願い致します.

  • hero1000
  • ベストアンサー率29% (114/390)
回答No.3

ファイルを一行一要素の配列として読み出して、splice関数を使えばいいと 思います。 splice( Array , Offset , Length , List ) ; とすると、配列Arrayの第Offset要素からLength個の要素を取り除いて 配列Listと置き換えます。 ListとLengthは省略できますので、 splice( Array , Offset , 1 ) ; とすれば任意の要素を1つだけ削除できるはずです。

  • myeyesonly
  • ベストアンサー率36% (3818/10368)
回答No.2

perl は判らないので、今後の参考回答です。 UNIX (Linux含め)では、そのものずばりそういう編集に非常に便利な vi というエディタがあります。 これの Win 版があるので、試されてはいかがでしょう。

参考URL:
http://hp.vector.co.jp/authors/VA003457/vim/vim3/vim.html
  • akino4
  • ベストアンサー率18% (35/185)
回答No.1

一旦ファイルを読んで、その行だけ飛ばして出力しかないのかなぁ・・・ とりあえずman見る限りそんな感じ・・・・(;;) 日本語のmanページへのリンクを参考までに・・・

参考URL:
http://www.att.or.jp/perl/man/perlfunc.1.html

関連するQ&A