質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Linux

    4443questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • UNIX

    430questions

    UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

Linuxでワンライナーテキスト処理をしたいと考えています。どなたか力を貸していただけませんか?

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,309

pleh

score 3

はじめまして。
初心者です。何卒よろしくお願いします。

ワンライナーテキスト処理をしたいと考えています

ワンライナーテキスト処理をしたいと考えています。どのようなコマンドがあり、どれを使えばいいのか、どのようなコマンドになるのかなどを教えていただけませんでしょうか?

やりたいこと

<tr align="right">
より1行から4行下

<tr align="right">
より
16行下

<tr align="right">

18行下

<td 以降任意の文字列>

</td>
の間に存在する
すべての任意の文字列(半角・全角・数字などは問わない)だけを抽出する
です。
すなわち、

<tr align="right">
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列></td>
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列></td>
<td 任意の文字列></td>
</tr>

<tr align="right">
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列></td>
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列></td>
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列></td>
<td 任意の文字列></td>
</tr>

<tr align="right">
~上と同じため省略~
</tr>
~以下同じため省略~


といったテキストがあった場合、ここに存在する文字列と書いてある部分は
どうすれば抽出できるかということです。
「ここに存在する文字列」は全角、半角、数字、アルファベット何であるかは分かりません。
親切な方がいらっしゃいましたら
何卒、よろしくお願いいたします。

追記(意図)

ワンライナーでスクリプトを作成しようと考えていました。
現在Webサイトからデータを保存するスクリプトをbashで書いています。
データの取得・保存まではできたのですが、欲しい部分以外のところも取得・保存されていたためです。

また、Linux初心者から少しでも上達するにはテキスト処理の知識・技術が不可欠だと思ったからです。

わかりにくい質問で申し訳ありませんでした。
何卒よろしくお願いいたします。

追記(現状)

cat web_file では
��でした。

vi web_file では
きちんと表示されていました。

cat web_file | nkf -Sw -Lu | cat web_fileでは、
��がニ鏆鋿セ
でした。
まだ文字化けしているようです。

追記(7/19)

nkf -g web_file
の結果は
EUC-JP

echo $LANG
の結果は
ja_JP.UTF-8

cat webfile | nkf -e > hoge.txt
で作成された
hoge.txt

vi hoge.txt
だと
文字化けしていませんでしたが、
cat hoge.txt
だと
文字化けしていました。
でした。

cat web_file | nkf -w > hoge.txt
cat hoge.txt

うまく行きました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Zuishin

    2016/07/12 12:12

    意図がよくわからないので答えにくいです。なぜワンライナーなんでしょうか?繰り返し使うものであればスクリプトを書きましょう。ワンライナーはいわゆる自己満足のため、技術誇示のため、パズルを解く楽しみのためなどに腕に自信のある方が「自分で」作られることが多いですが。

    キャンセル

  • Zuishin

    2016/07/12 16:17

    修正ありがとうございます。どうもすれ違いがあるように感じました。ワンライナーのワンは 1 で、ラインは行、つまり一行プログラムのことです。一行で書く必要がありますでしょうか? スクリプトを作成するなら、無理やり一行に詰め込むよりも可読性を重視した方が良いのではないかと思いますが。

    キャンセル

  • pleh

    2016/07/12 17:38

    返信いただきましてありがとうございます。
    いろいろと勘違いをしていました。
    大変失礼しました。
    ライブラリや環境の構築に苦手意識を持っていたため、ワンライナーと考えていました。
    テキスト処理よりもWebスクレイピングをすることを重視した方が良さそうだと感じました。
    Webスクレイピングに用いるとしたら、Perl、Python、Ruby等があるそうですが、
    環境の構築、ライブラリ等の導入がやりやすく、プログラム初心者におすすめできるものはどれでしょうか?

    何卒よろしくお願いいたします。

    キャンセル

  • Zuishin

    2016/07/12 17:57

    hotta さんがまさにお求めになっているものを、しかもワンラインで書かれていますが、その中でおっしゃっている通り、複数のコマンドを組み合わせて要らない部分を削っていくのが良いかと。ワンライナーがいけないと言うのではなくて、「なぜワンライナーなのか」という部分に問題の隠れた鍵があるのではないかと勝手に思っていました。pleh さんが挙げられたものはすべて Linux に標準で入っていますので、環境構築は特に必要ないと思います。ライブラリもどれも充実していて、あとは好みかと。

    キャンセル

回答 4

+3

使用するコマンドとしては、cat, head, tail, sed, awk, grep などが考えられます。ワンライナーの場合、複数のコマンドを組み合わせるのが普通です。

まず、サンプルとして提示されているテキストが input.html に入っているとします。

たとえば sed を使うのであれば、
https://hydrocul.github.io/wiki/commands/sed.html
によると、"<tr align="right">" から5行(その行も含む)を表示するのは

$ sed -n -e '/<tr align="right">/,+4p' < input.html
<tr align="right">
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列>ここに存在する文字列</td>
(以下略)


のようになります。

このままでは "<tr" の行が邪魔なので、この行を取り去るには、たとえば以下のようにします。

$ cat input.html | sed -n -e '/<tr align="right">/,+4p' | grep -v 'tr align="right"'
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列>ここに存在する文字列</td>
<td 任意の文字列>ここに存在する文字列</td>
(以下略)

こんな感じで、地道に1つずつ攻略して、求める解に近づけていきます。

なお、ワンライナーは基本的に使い捨てです。同じ処理を何度も実行して実運用に載せていくのであれば、bash/perl/php/ruby/python 等でスクリプト化するのが普通だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/12 17:46

    hotta様
    はじめまして。
    >なお、ワンライナーは基本的に使い捨てです。同じ処理を何度も実行して実運用に載せていくのであれば、bash/perl/php/ruby/python 等でスクリプト化するのが普通だと思います。
    Webスクレイピングをしたいと考えています。
    繰り返し使用するようになってくるかと思います。
    >使用するコマンドとしては、cat, head, tail, sed, awk, grep などが考えられます。ワンライナーの場合、複数のコマンドを組み合わせるのが普通です。
    環境の構築やライブラリの導入等に苦手意識を持っています。
    コマンドの組み合わせのほうが楽だと思っていたのですが、Webスクレイピングをすることに関しては他のプログラム言語を使用したほうがいいでしょうか?
    アドバイスいただけましたら幸いです。
    何卒よろしくお願いします。

    キャンセル

  • 2016/07/12 20:57

    コマンドの組み合わせでちゃちゃっと書けるような簡単な仕様ではなさそうなので、少なくともワンライナー(1行コマンド)ではツライでしょうね。

    もともと bash で書いていたということですので、それを踏襲するなら、bash スクリプトの中で複数のコマンドを組み合わせて実現することになるでしょう。この場合、複数のコマンドを使いこなす技量が必要です。結果は複数行に渡ることになるでしょうから、もはやワンライナーじゃないですね。

    複数のコマンドを調べて使いこなすか、一つの言語でその中の機能を組み合わせるかのどちらかになるかと思います。自分なら(自分が使い慣れている)PHPで書くかな。PHP自体、膨大な関数を内蔵していますので、いろいろライブラリを入れなくてもそれなりに書けると思います。

    キャンセル

+3

途中までbashで書かれているならそのまま抽出まで行う事も可能かと思い作成しました
(#は半角です。)

#!/bin/sh
while read tt; do
echo $tt | grep -q '<tr align="right">'
if [ $? -eq 0 ]; then
CN=0
continue
fi
if [ $(echo $tt |sed 's/ //g' | wc -c) -le 1 ]; then continue; fi
CN=$(( $CN + 1 ))
if [ $CN -ge 1 ] && [ $CN -le 4 ] || [ $CN -eq 16 ] || [ $CN -eq 18 ]; then
echo $tt | cut -d\> -f2 | cut -d\< -f1
fi
done<hogehoge.txt

一応ワンライナーperlですが 空白行はsedで逃げました、perlでも出来ますが。

cat hogehoge.txt |perl -nle'($_=~/<tr align=\"right\">/)? $i=0:$i++;if($i>=1 && $i<=4 || $i==16 || $i==18){print substr($_,index($_,">",2)+1,index($_,"</td")-index($_,">",2)-1)}' |sed /^$/d

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/13 14:36

    A.Ichi様
    はじめまして。
    ご回答いただきましてありがとうございます。

    Webから抽出したたテキストを整理したいと、
    思い早速やってみたのですが、
    日本語の部分が文字化けをしていました。
    どのようにすれば文字化けを回避することができるでしょうか?
    よろしくお願いします。

    キャンセル

checkベストアンサー

+1

bashの場合は、webから食わせる前に実行環境の日本語環境に合わせて置く必要があります。
通常nkf等を使って変換します。(UTF8)
cat web_file | nkf -Sw -Lu >hogehoge.txt

perlの場合内部文字コードへの変換する方法があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/15 14:28

    ありがとうございます。

    cat web_file では
    ��でした。

    vi web_file では
    きちんと表示されていました。

    cat web_file | nkf -Sw -Lu | cat web_fileでは、
    ��がニ鏆鋿セ
    でした。
    まだ文字化けしているようです。

    よろしくお願いします。

    キャンセル

  • 2016/07/18 10:24

    cat はログインの文字コードの依存します、viは設定にもよりますが自動的に変換されます。
    nkf -Sw -Lu は入力ファイルがsjisの場合で出力がUTF8のWindowsファイルを想定しています。
    まずnkf -g web_file と入力して中身の文字コードを調べます。
    ecoh $LANGでログインの文字コードを調べます。
    この2点をパラメータとして設定します。
    EUCの場合は-eを使います。詳しくはnkfをググって頂くとわかります。

    キャンセル

  • 2016/07/19 15:47

    nkf -g web_file
    の結果は
    EUC-JP

    echo $LANG
    の結果は
    ja_JP.UTF-8

    cat webfile | nkf -e > hoge.txt
    で作成された
    hoge.txt

    vi hoge.txt
    だと
    文字化けしていませんでしたが、
    cat hoge.txt
    だと
    文字化けしていました。
    cat web_file | nkf -w で
    うまく行きました!!!!
    ありがとうございます!!!!

    cat web_file | nkf -w > hoge.txt
    cat hoge.txt

    うまく行きました。




    追伸:
    cat web_file | nkf -w | cat web_file
    ではうまく行きませんでした。
    恥ずかしながら、勘違いしていたようです。

    キャンセル

+1

web_fileがEUC-JPで端末がUTF-8だったのですね。
上記のコマンドは最後のcatな要らないと思います。cat web_file | nkf -w
入力に半角カナが有る場合を想定すると-xオプションを入れた方が良いかと。
また-E(明示指定)を加えると自動判断による変換ミスも少なくなります。
cat web_file | nkf -Ew -x

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Linux

    4443questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • UNIX

    430questions

    UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

  • トップ
  • Linuxに関する質問
  • Linuxでワンライナーテキスト処理をしたいと考えています。どなたか力を貸していただけませんか?