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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

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

UNIX

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

Q&A

解決済

4回答

2907閲覧

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

pleh

総合スコア11

Linux

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

UNIX

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

2グッド

1クリップ

投稿2016/07/12 02:35

編集2016/07/19 06:49

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

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

###やりたいこと

<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

うまく行きました。

dlrowolleh, mondaminZ👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2016/07/12 03:12

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

2016/07/12 07:17

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

2016/07/12 08:38

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

2016/07/12 08:57

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

回答4

0

途中まで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/12 11:59

編集2016/07/12 12:25
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pleh

2016/07/13 05:36

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

0

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

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

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

sed

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

のようになります。

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

sed

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

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

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

投稿2016/07/12 03:47

hotta

総合スコア1613

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pleh

2016/07/12 08:46

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

2016/07/12 11:57

コマンドの組み合わせでちゃちゃっと書けるような簡単な仕様ではなさそうなので、少なくともワンライナー(1行コマンド)ではツライでしょうね。 もともと bash で書いていたということですので、それを踏襲するなら、bash スクリプトの中で複数のコマンドを組み合わせて実現することになるでしょう。この場合、複数のコマンドを使いこなす技量が必要です。結果は複数行に渡ることになるでしょうから、もはやワンライナーじゃないですね。 複数のコマンドを調べて使いこなすか、一つの言語でその中の機能を組み合わせるかのどちらかになるかと思います。自分なら(自分が使い慣れている)PHPで書くかな。PHP自体、膨大な関数を内蔵していますので、いろいろライブラリを入れなくてもそれなりに書けると思います。
guest

0

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

投稿2016/07/19 11:29

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

投稿2016/07/14 13:50

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pleh

2016/07/15 05:28

ありがとうございます。 cat web_file では ��でした。 vi web_file では きちんと表示されていました。 cat web_file | nkf -Sw -Lu | cat web_fileでは、 ��がニ鏆鋿セ でした。 まだ文字化けしているようです。 よろしくお願いします。
A.Ichi

2016/07/18 01:24

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

2016/07/19 06: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 ではうまく行きませんでした。 恥ずかしながら、勘違いしていたようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問