LoginSignup
0
0

More than 3 years have passed since last update.

行から目的の文字列を抜き出したいときの方法 コマンド4選

Posted at

Python クローリング&スクレイピング―データ収集・解析のための実践開発ガイド-
https://www.amazon.co.jp/dp/B01NGWKE0P/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

という書籍の
1.4.1電子書籍の総数を取得する
という章から学習した内容

grepで抜き出したhtmlコードから文字列のみを正規表現で抜き出すという操作
方法は4つ紹介されており

1. sedコマンドで正規表現にマッチした箇所を抜き出す
2. sedコマンドでマッチした箇所を取り除き、残った場所を取り除く
3. cutコマンドを使って特定の文字で区切られた文字列からn番目を抜き出す
4. awkコマンドを使ってスペースで桁揃えされた文字列からn番目を抜き出す

そもそものコマンドを知らない。。。のですが、前のページにsed,cutの説明はありました。

sed (Stream EDitorの略)

使用タイミング: 特定の条件にマッチする行を置換、削除できる
使用方法: 's/検索する正規表現/置換する文字列/オプション'

【使用例】

# .をスペースに置き換えて出力することができる /gは1行に検索する正規表現が複数回出現しても全部置き換えるということと同じ
XX | sed 's/./ /g'

cut

使用タイミング: 特定の文字で区切られたテキストの一部の列を抜き出すときに使う
【使用例】

# ,で区切った1列目と2列目のみを出力する。-dで区切り文字、-fで列の番号を指定。
XX | cut -d , -f 1,2

本題の1~4の方法で抜き出す処理について一つずつ見ていきたいと思います。

1. sedコマンドで正規表現にマッチした箇所を抜き出す

使用方法: sed -E 's/.*(抜き出したい箇所にマッチする正規表現)./\1/'
解読:
. は任意の1文字にマッチする
* は直前のパターンを0回以上繰り返す
() は()で囲まれたパターンをグループ化する 例: (hello)は hello-world や world-helloにマッチする
\1 は全体を抜き出したい正規表現に置き換える(キャプチャ)する

【使用例】

echo hello_world | sed -E 's/.\*(hello.).*/\1'
# 出力結果 
  hello

2. sedコマンドでマッチした箇所を取り除き、残った場所を取り除く

解読:
[ ]内の^ は否定を表す
* は直前のパターンを0回以上繰り返す
→ < XXXXX > のようなパターンを空白にする = <>で囲んでいる場所を削除

【使用例】

echo'<li class="pagingnumber">130/2098</li>' | sed -E 's/<[^>]*>//g'

3. cutコマンドを使って特定の文字で区切られた文字列からn番目を抜き出す

使用タイミング: csvから文字列を抜き出す時
解読:
'-d , -f 2' は 区切り文字, 区切られた文字列から2番目の項目

echo '1,野球,阪神' | cut -d , -f 2
# 出力結果
  野球

4. awkコマンドを使ってスペースで桁揃えされた文字列からn番目を抜き出す

スペースで桁ぞろえされていて、区切り文字が連続するときに使える。
(cutは区切り文字が連続するときには向いてない)
{print $n} という文字列を与えるとn番目の文字列を抜き出すことができる。

echo 'A B C D E' | awk '{print $4}'
# 出力結果
 D
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0