MacOS X 10.6のターミナルでSEDを使って文字列を抽出する方法

このQ&Aのポイント
  • MacOS X 10.6のターミナルを使って文字列を加工して抽出する方法についての質問です。
  • sedコマンドを使用して、hoge/から始まりhtmで終わる文字列から .310を取り除いた文字列を抜き出してファイル一覧のテキストに書き出す方法を教えてください。
  • また、1.txtの行数が不定で変動するため、2.txtの行数も増えていきます。
回答を見る
  • ベストアンサー

SED等で文字列を抽出したい

MacOS X 10.6のターミナルを使って文字列を加工して抽出する方法の質問です。 次のような複数行からなるテキスト(ファイル名を 1.txt とします)があります。 <a href="./hoge/82111.310.12345000.htm" target="_blank"> <a href="./hoge/42403.310.33345025.htm" target="_blank"> <a href="./hoge/22154.310.50873323.htm" target="_blank"> ... このテキスト(1.txt)から、sed(?もっと適切なものがあれば別のものでも)コマンド を用いて 82111.12345000.htm 82401.33345025.htm 82111.50873323.htm ... といった具合に、 hoge/ のあとから始まり htmで終わる文字列から .310を取り除いた文字列を抜き出して ファイル一覧のテキスト(2.txt) に書き出す方法を教えてください。 なお、1.txtの行数は不定で変動し、その行数に応じて2.txtも行数が増えていきます。 また htmのファイル名のところは 5桁のランダムな数字.310.8桁のランダムな数字.htm という規則になっています。(.310 と.htm の部分は固定です) よろしくお願いします。

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

  • ベストアンサー
  • sholmes
  • ベストアンサー率81% (89/109)
回答No.1

とりあえずこんな感じとか sed -r 's/^<a href="\.\/hoge\/([0-9]{5}\.)310\.([0-9]{8}\.htm)".+/\1\2/' 1.txt > 2.txt 1.txtの内容がそれだけしっかり統一されているのであれば、もっといい加減に書いても動くと思います。 ちなみに置換後サンプルの82401とか82111って、42403と22154の事ですよね?

spotunixbenkyo
質問者

補足

ご回答ありがとうございます。 早速試したところ、OSX の sedでは -rオプションが使えない みたいなエラーメッセージがでたので、 いろいろ検索して「OSXのsedでは拡張正規表現(?)を使うには -Eをつける」という記述のページがあったので -rを -E オプションに変えてみて実行しました。 結果、一行目の<a href="./hoge/82111.310.12345000.htm" target="_blank"> から 82111.12345000.htm を抜き出した 2.txtが生成されました。 ですが、二行目以降は抜き出せません。 1.txt中のすべての行の*****.*********.htmを抜き出すにはどうすればいいでしょうか? >> ちなみに置換後サンプルの82401とか82111って、42403と22154の事ですよね? すみません。おっしゃる通りでサンプル記載ミスです。

その他の回答 (2)

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.3

[ANo.1] さんはかなりきれいな正規表現をかいてくれてるとおもうよ。 とりあえず、つぎのコマンドをためしてみて! sed '1d' 1.txt これで何も表示されなかったら、1.txt の改行コードが sed で期待されるコードとちがってるのかもね。 テキストエディタで改行コードをかえて何回かやってみて! ってこれだけかいて終わりなのもなんだから、 いい加減なのを一つ。 sed '/"\.\/hoge\/\([0-9][0-9]*\)\.[0-9][0-9]*\.\([0-9][0-9]*\)\.htm"/s//\1.\2.htm/' 1.txt > 2.txt

spotunixbenkyo
質問者

お礼

改行コードを変えたところ、sholmesさんのコマンドで正常にかきだせました。 教えてくださった正規表現についても大変参考になりました。 (といってもまだ正規表現の せ の字もわかってない段階ですが、一つずつ噛み砕いて勉強させていただきます。 ありがとうございました。

  • sholmes
  • ベストアンサー率81% (89/109)
回答No.2

ありゃすみません・・・ 同じ環境が無いので、念のためMacOS10なら入ってそうなRubyに変えさせてください Ruby1.8.7 ruby -ne '/(\d{5}\.)310\.(\d{8}.htm)/ =~ $_; puts("#{$1}#{$2}")' 1.txt > 2.txt

spotunixbenkyo
質問者

お礼

No.3 dscriptyさんの指摘にあった 改行コードが原因だったようです。 No.1(オプションを -Eに変更)、No.2のどちらでも、希望のとおりの抽出変換ができました。 正規表現で理解できない部分もありますが、いただいた回答例を参考にしながら勉強してみます。 今回はありがとうございました。

関連するQ&A

  • 特殊なテキストエディタ

    <A href="901927192719.jpg" target="_blank"> <A href="901920002719.jpg" target="_blank"> このような<A hrefとblank">の間にはさまれた文字を消すことができるテキストエディタはないんでしょうか? 少しわかりにくいですね、もうすこし説明すると。 <A href="*****" target="_blank"> *=ランダムな文字。 <A href="*****" target="_blank"> これを他の文字に置き換えることができるテキストエディタはありませんか? わかりにくくてすいません、よろしくおねがいします。

  • エクセルのセル内の文字列から抽出したい

    A列に <a href="http://URL/" target="_blank">サイト名</a> という文字列が1000個くらい入っています。 B列にURL部分のみ、C列にサイト名のみを取り出したくて、 B1に左から9文字を削って =SUBSTITUTE(A1,LEFT(A1,9),"") とか入れてみるのですが、これだとURL部分以降の " target="_blank">サイト名</a> が残ってしまいます。 C1には何を入れたら前後の文字列が削除できてサイト名だけになるのかもわかりません。 URLはセルごとに文字数が違うので、どの関数を使えば一括で B1にURL、C1にサイト名が表示されるようになるかアドバイスをお願いいたします。

  • 文字列抽出についてご質問です。

    文字列抽出についてご質問です。 csvファイルの中に、http://hoge.com/◎◎/goods_parts/◎◎/数字1~5桁/◎◎・・・ のようなデータがずらっと1000行くらいあって、 このURLの中にある数字1~5桁が、別ファイルの1~5桁の数字だけがあるファイルと合致したら、 出力のようにしたいです。 そこで、phpかexcelvbの正規表現で、 ・数字のみを抽出するサンプルコードをおしえていただけないでしょうか。 なにとぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 2つのファイルを用いた文字列置換(削除)の方法

    こんにちは。 テキストファイルA.txtに、検索したい文字列を1行ずつ入れておき、別のテキストファイルB.txtのうち、A.txtにある文字が含まれている行を削除するという作業をしたいです。 例えば A.txt AAA BBB B.txt hoge hogeAAAhoge hogeBhoge hogeBBBhoge の場合、 hoge hogeBhoge を出力させたいです。 このような処理ができる方法はないでしょうか?(コマンドやプログラム等)

  • Excel特定の文字列を抽出する関数を教えてください。

    A列に***AAA/2桁の数字***と言う値があります。 *はランダムです。 2桁の数字もランダムです。 AAA/2桁の数字のみを抽出する関数を教えてください。 重複する値は、1つを残して削除したいです。 よろしくお願いします。

  • Excelから任意の文字列を抽出したい

    A列にリンクのタグがあるのですが、このような文字列から【リンク先】という部分と、【<img src="" alt="">】の部分だけを取り出したいと思いますが、上手く出来ません。 A列に入っているタグは→<a href="リンク先" target="blank"><img src="" alt=""></a> A列にリンクのタグが入っています。 B列に【リンク先】 C列に【<img src="" alt="">】 となるようにしたいです。 又A列の文字列には、<img src="" alt="">が続いて2つか3つ入っているものもありますが、その場合は、D列・E列に順番に抽出したいです。 最大でも<img src="" alt="">は4つまでしか入っておりません。 ダブルコーテーションの扱いなどがよく分からなくて、詳しかたいれば教えていただけるとありがたいです。 よろしくお願いいたします。 ※【】はわかりやすくするためのものです。

  • 正規表現による文字列の抽出

    $data = 'a b c<a href="x/y/z/hoge.jpg">hoge.jpg </a> …<A HREF = "aa/b/c/hoga.jpg">hoga.jpg</A>…'; 上記の文字列から正規表現で 『x/y/z/hoge.jpg』と『aa/b/c/hoga.jpg』を取り出して配列に格納しようと思っているのですがうまくいきません。 条件は 1.『<a href="』(大文字の場合、またはイコールの前後に半角スペースが含まれる場合もあります。)と『">』に囲まれています。 2.文字列中に何回登場するかは決まっておりません。 3.取り出す文字列の長さはきまっておりません。 以下のように書いてみたのですが…。書き方がわかりません。 どなたかご教授いただけないでしょうか。 よろしくお願いいたします。 while ($data =~ /<a\s[hH][rR][eE][fF].=.\".*?">/g){ push(@arr, $&); } foreach(@arr){print $_,"\n";}

    • ベストアンサー
    • Perl
  • phpでpreg_replaceで次のような条件の文字を置換したいのですが…

    <a href="jump?url= *1 " target="_blank"> *2 </a> というAタグになっている文字列を *2 だけのテキストにしたいと思っています。 preg_replaceでの正規表現での条件がわかりません…。

    • ベストアンサー
    • PHP
  • カッコを使った文字列の分割について

    文字列がいくつか存在し(個数不定)、そのそれぞれの文字列はカンマで区切られております。 その中には、文字列+カッコに挟まれた文字列、というのも存在します。 ex1) hoge,test(hogehoge),nana その文字列をカンマで区切り、それぞれをaタグで結びます。 ex2) <a href="hoge">hoge</a>/<a href="test(hogehoge)">test(hogehoge)</a>/<a href="nana">nana</a>/ ---現段階で自力で完成したのはここまでです--- 今度はそのうち、カッコで区切られているモノも分割し、aタグで結ぼうと思います。 ex3) <a href="hoge">hoge</a>/<a href="test">test</a>(<a href="hogehoge">hogehoge</a>)/<a href="nana">nana</a>/ このように扱いたいのですが、どうすればいいでしょうか。 参考までにex2までのソースを張っておきます。 お返事、お待ちしております。 以下、ソース抜粋 $LOADSNG="hoge,test(hogehoge),nana"; $EXPSNG=split(",",$LOADSNG); foreach($EXPSNG as $KEYSNG=>$VALSNG){ echo ($KEYSNG==0?"":"/").'<a href="'.$VALSNG.'">'.$VALSNG.'</a>'; }

    • 締切済み
    • PHP
  • HTML文字列を取得→加工→書き出すスクリプト

    CGI(perl)がこういうHTMLを書き出すのですが、 <html> <body> <p><a href="file:///C:\temp\hoge1.txt">file:///C:\temp\hoge1.txt</a></p> <p><a href="file:///C:\temp24\hoge2.txt">file:///C:\temp24\hoge2.txt</a></p> :(中略) <p><a href="file:///C:\temp78\hoge15.txt">file:///C:\temp78\hoge15.txt</a></p> </body> </html> ↑のハイパーリンクに加え、hoge.txtが置かれている親フォルダへの リンクも併設したいです。イメージとしては、次のような感じです、 <html> <body> <p><a href="file:///C:\temp\hoge1.txt">file:///C:\temp\hoge1.txt</a><br> ↑のファイルがあるフォルダを開くなら<a href="file:///C:\temp\">こちら</a></p> <p><a href="file:///C:\temp24\hoge1.txt">file:///C:\temp24\hoge1.txt</a><br> ↑のファイルがあるフォルダを開くなら<a href="file:///C:\temp24\">こちら</a></p> :(中略) <p><a href="file:///C:\temp78\hoge15.txt">file:///C:\temp78\hoge15.txt</a><br> ↑のファイルがあるフォルダを開くなら<a href="file:///C:\temp78\">こちら</a></p> </body> </html> みたいに、ページを表示するたびに フォルダパスも記述されるという… JavaScriptで実現できますでしょうか?よろしくお願い致します。