• ベストアンサー

SEDで教えてください。

Perlのカテで申し訳ないのですが、SEDの記述で教えてください。 次のテキストの”ページ 105”以外の部分をすべて削除する処理の記述はどのようにしたらよいのでしょうか? ページの次の数字105は、いろんな数字が出てきます。 残す部分以外の文字列もいろんなものが出てきます。 ------テキスト--------------- あいうえお ページ 105:かきくけこ1000円さしすせそ。 たちつてと ------------------------------ ↓ -----処理後------------------- ページ 105 ------------------------------

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

  • ベストアンサー
  • hira6bg
  • ベストアンサー率61% (8/13)
回答No.2

醜いですがいかがでしょうか? ○元のファイル org.txt ○テンポラリファイル tmp.txt ○結果ファイル result.txt sed '/ページ [0-9]*:/!d' org.txt > tmp.txt sed 's/:.*$/:/' tmp.txt > result.txt

coral_japan
質問者

お礼

お答えありがとうございます。 さっそく、やってみましたところ、うまく出来ました。 !dは初めて知ったので、また使ってみようと思います。

その他の回答 (6)

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.7

今では sed も古典芸能になってしまったようですね。 本当は sed の実力からすれば1行でも書けます。 sed -n '/^ページ/s/:.*//p' text あるいは sed -n '/^ページ/s/^\(ページ[ 0-9][ 0-9]*\).*/\1/p' text しかし、いくら困り度1だからって何日もほったらかしでいいって ことにはならないと思うけど。

回答No.6

これでどうですか?? s/^ページ \([0-9]+\):\(.*\)/ページ \1:/g s/^\([^ペ]\)\(.*\)//g ただし、頭にぺがつく行がのこりますので、あとで、その行を削除してください。 完璧でなくてごめんなさい。

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.5

こんばんは。要は「:」以降を削除すればいいのでしょう。 sed '/^ページ/{ s/:.*// p } d' text なんていかがです。

  • aton
  • ベストアンサー率47% (160/334)
回答No.4

No.3です。訂正と補足です。 s/\(ページ[1-9][0-9]*\)/\1/ の方が良いと思われます。 「ページ...」を含まない行の削除はNo.1,No.2のかたの方法を利用してください。 #ホールドスペースを使えば1回で書けるかもしれませんが。

参考URL:
http://www.gcd.org/sengoku/sedlec/
  • aton
  • ベストアンサー率47% (160/334)
回答No.3

\( .. \) を使えばいいのではないでしょうか? s/\(ページ105\)/\1/ 但し「ページ105」が2行以上出現する場合全部残ります。 #No.1のかたの方法だと「かきく~せそ。」も #残ってしまうのではないでしょうか?

参考URL:
http://www.kt.rim.or.jp/~kbk/regex/regex.html#SED
回答No.1

どうしても、sedでなければだめですか? 案外、grep ですと簡単に抽出できます cat ほにゃらら.txt | grep '^ページ105' > 処理後ファイル

coral_japan
質問者

お礼

お答えありがとうございます。 grep検索ですね。。ページ105の105の部分が201だったり、305だったり各種あります。 105の部分を変数のようにできますでしょうか?