🐐

WSLを呼び出してシェル芸する

2023/05/17に公開

概要

なんとなくzennを始めたので、テストを兼ねた投稿です。

WSL(Windows Subsystem for Linux)を使ってるホスト側(Windows)で、
いつも同じようなシェル芸を使ってテキスト加工するときに使えるネタです。
作業環境のホスト側にPythonいれてあって、業務で同じシェル芸を繰り返す方に役立ちます。

補足:そもそもbash等のシェルスクリプトで済むじゃんって話ではあるのですが・・・

想定

ノートアプリで学習サイト[1]のメモを書き残すようなときに、
各タイトルが含まれるページをHTMLで保存したものから抽出するケースを想定してます。

今回は以下の二つをそれぞれテキストファイルに出力する処理をを実装します。

  1. Udemyの学習タイトルを抽出する。
  2. 各コンテンツタイトルにメモ欄とコードブロックをマークダウンで加筆する。

二つ目は理解しづらいので、以下がイメージです。

#### コンテンツタイトル1
memo
```
```

#### コンテンツタイトル2
memo
```
```

#### コンテンツタイトルn
memo
```
```

実装

WSL上のubutuの呼び出しをPythonを用いて実装します。
subprocessは組み込み関数なので特にpip installは不要です。
あと成功だとリターンコードとして「0」をターミナルに表示します。失敗だと「1」とかです。

import subprocess

print(subprocess.check_call(["ubuntu", "run", " cat /etc/lsb-release"]))

ここからは、具体的に実装します。
Udemyで学習コンテンツが掲載されたページを「udemy.html」として保存します。
シェルは標準で使えるgrepsedでゴチャゴチャ加工してみました。

補足:もっと加工が必要なケースはPandocを使って変換するのがオススメです。

udemy_change.py
import subprocess

# 学習タイトル抽出(エスケープ処理やクォーテーションに注意が必要)。
print(
    subprocess.check_call(
        [
            "ubuntu",
            "run",
            "cat udemy.html | grep -oP 'セクション.*?</span>' | 
	    sed -E 's/<\/span>//g' | sed -e '1d' | sed -e '/^$/d' | 
	    sed -e 's/^/# /g' > udemy_title.txt",
        ]
        # おまじない(中間shellプロセス避け)
        , shell=False
    )
)

# 各コンテンツタイトル抽出。
print(
    subprocess.check_call(
        [
            "ubuntu",
            "run",
            "cat udemy.html | 
	    grep  -oP '<span data-purpose=\"item-title\">.*?</span>' | 
	    grep -o '[0-9.].*<' | sed 's/<//; s/\.//;' | 
	    sed -e '/^$/d' | sed -e 's/^[0-9]\+/####/g' | 
	    sed '2~1iMemo\\n```\\n```\\n' > udemy_content.txt",
        ]
	, shell=False
    )
)

必要ならログ取得や例外処理の追加、クラスにして加工すれば、
Pythonの方が複雑なケースも対応できて有用に使えるかもしれません!! 以上

脚注
  1. 今回はUdemyの学習コンテンツページをhtml形式で保存した場合で記述してます。 ↩︎

Discussion