先日紹介したObsidianという「ローカルで動くノートシステム」 試しにRoam Researchのデータを取り込んで色々なことを試しているんですが、それ以来「テキストの一括編集」というのを色々やっています。(Obsidian触ってる時間より、sedでの置換方法を学んでいる時間の方が多いくらい) 例えばRoam Researchのデータをローカルに落とす。これをObsidianに読み込むと、全部行頭に - (ハイフン)が付いてくるんだけど、この「行頭にある」「ハイフンだけ」を取り除きたい。 例えばScrapboxのテキストをローカルにコピペしてくる。その場合、Scrapboxに貼り付けたgyazoのURLを、Obsidianのプレビューでもちゃんと表示されるようにしたい。 そんなことをする場合に便利なのが、Linuxコマンドの「sed」と「rename」というやつ。 この手の知識や技術をきちんと基礎から語れるほどきちんと理解はできていないんですが、簡単なコマンドをちょこっと覚えておくだけで、ローカルでテキストファイルを一括処理する、ということが驚異的に簡単になります。 こういうローカルでの一括のテキスト処理、というのはRoam ResearchやScrapboxでは「実質できないこと」であり、そういう意味でもObsidianを使うならば覚えておいて損はしないことなんじゃないかな、と思います。 基本的なことを教える知識はないけど、自分がRoam ResearchdとかScrapboxにまとめてたデータをObsidianに持ってくる際に便利だったコマンド、というのは色々あるので、それを紹介したいと思います。 基本的な「ターミナル」の使い方は、shell 基本、だとか bash 基本 などで検索してください。また、ファイルの削除などはミスるとあっけなく大変なことになるので、くれぐれもご注意ください。 以降基本的にObsidianのディレクトリ上での操作です。 ## ファイル名の変換ならばMacの標準機能でできる Roam Researchのデータをローカルに落として最も不便だったのが、日付の形式がYYMMDDではなく「Sep 10 ,2020」みたいな欧米フォーマットだったこと。 これに関しては、ファイル名の一括変更ができる rename というコマンドもあるんですが、割と地道にMacの「複数項目の名前変更」を使った方が(自分のような不慣れな人間には)わかりやすかったりします。 どうせ月の名前が12種類あって、それを1行で全部やるのは無理で、こういう感じで12ヶ月分の変換&31日分を根性出してやらないと変換できませんでした。 フォルダ下の.mdというファイル名から、September、というテキストを09-に置き換える `rename 's/September /09-/' *.md` ファイル名の -1st を 01 に置き換える(\\はエスケープ文字と呼ばれるもの) `rename 's/-1st/01/' *-*.md` 末尾の, 2020を消す `rename 's/, 2020\.md$/.md' *2020.md` 先頭に20を付け足す `rename 's/^20//' *.md` こんな感じのことをやって、ファイルは「2020」のような年単位のフォルダに移動させました。 rename 正規表現で変換指定 対象のファイル名を指定 というのが基本ルール。 基本的な使い方は `rename --h` renameでファイル名の変換前にテストする場合には「-n」をつける、と覚えておくことで、色々練習しながら変換ができます。 ## ファイルの中身を変換する 行先頭の - (ハイフン)を消す `sed -i bak 's/^\- //g' *.md` プレーンテキストでコピーしてきたGyazoURLをマークダウンに変換 `sed -i bak 's/^https:\/\/gyazo.com\/\(.*\)/![Image from Gyazo](https:\/\/i.gyazo.com\/\1\.jpg)/g' **.md` 1行にまとまった状態の https://~ を改行する。 これはちょっとめんどくさくて、1行目の最後、\\を書いたところでエンターを押して改行した後に続きを書いて再度エンター(これによって無理やり改行コードを挿入するのが一番簡単) `sed -i bak 's/https:\/\/\(.*\)https/https:\/\/\` `https/g' **.md` https が3連続で登場する場合の再起処理がわからなくて、同じコマンドを2〜3回繰り返す、という手法で乗り切った。 sedの場合は、 -i bak というのでファイル名末尾に「bak」という文字をつけたバックアップを残して、実行する、という仕組み。 \-i bak をなしで実行すると、ターミナル上のみに結果が反映されて、ちゃんと正規表現があってるかチェックできる。 ## まとめ 10年以上も前に、かつてのはてなダイアリーに「正規表現の基礎」みたいな記事を自分で書いてたんだけど、なんだかんだあの時ターミナルとか正規表現とかある程度学んでおいて今役立ってるなあ、と思います。 [Perl 正規表現置換 超基本 - goryugo](https://goryugo.hatenadiary.org/entry/20080527/1211831671) あと、この勢いでテキスト処理についていろんなことお勉強してるんですが、Scrapboxからエクスポートしたjsonファイルとかも、思ってた以上に簡単にマークダウンファイルに変換できそうなので、それも上手くできたらブログで紹介などしたいと思います。