Archive for the ‘Unix’ Category

今年の末にyahooブログがサービスを終了するにともなって、そのブログをwordpressに移行したいという依頼があった。
その中で、インポート用のテキストファイルから画像ファイルのリスト化をする処理の部分でawkを使ったところ、一行に2つ以上のimgタグとsrcが存在した場合、上手く要素を取得できないという問題に行き当たった。

こういう状態↓
dbf3ea701fd1719c9365a88c266f7709.png

私は最初、キャプチャーの位置を()でグルーピングして\1,\2などで取得するという方法しかわからなかった。
しかし、これでは当然、一行に3つ以上の要素がある場合マッチできない。

結局的に以下のコードでうまく行った。

awk 'BEGIN{FS="src=";}
{
	for(i=2;i<=NF;++i){
		if(match($i,/"[^"]*"/)){
			print substr($i,RSTART+1,RLENGTH-2);
		}
	}
}' ./source.txt

フィールドセパレーターを"src="に設定してあげることで、一行はimgタグのsrcで分割される。
iの初期値が2から始まっているのは、awkのカウントは0オリジンではなく、1オリジンであり、なおかつ"src="で区切られたフィールドの2つ目からマッチの試行を行いたいため。
あとは行中のマッチ位置のインデックスをRSTARTとRLENGTHで取得し、substr関数で切り抜く。

neovimでコーディングしようと思ったところ、deinのneosnippetの更新がうまくいかないことに気づいた。

設定ファイルを見てみるも、特に異常が見当たらない

んー?と思って

neovim内で

:UpdateRemotePlugins

を実行してみる。

動かない、どころか、neovim起動時にダラダラとエラーを吐くようにまでなってしまったw

これからコード書こうと思ったのにー!うわああああ/(^o^)\オワタ

と思いつつも、冷静に何が悪いのかを推察してみる。

ひょっとしてdeinの設定ファイル見てる最中にどっかいじったのかなー、だとしたらこれバックアップ取ってないんですけどー!うわああああdein入れ直し\(^o^)/オワタ

ととても冷静と言える状態ではなかったが、

deoplete.nvimが効かなくなった時の手元できる対処法

というサイトを発見したので、まずはneovimに入って
:CheckHealth

をしてみると、どうやらpython3のproviderがエラーとなっている様子

ほうほう、なにかが変わってしまったのだろう。

と思いつつpython3のneovimの更新をかけてみる

pip install neovim

その後、もういちどCheckHealthをかけるとエラーが消えてる!やったー!

と思ったけどまだ、まともには動かない。

その後、

:call dein#update()

をかけると動くようになった。

よかったーと思うとともに、これからdeinの設定ファイルのバックアップを可及的速やかに取ります。

上記サイトの管理人さんありがとうございました

terminal

ターミナルの、あるディレクトリの中で同じ接頭辞のならんだファイル群をvimで編集しようとするとき、ターミナルの予測(タブキー)を叩きまくるのが面倒です。

具体的にはこんな状態

_hoge_hoge
_hoge_fuga
_hoge_piyo
_hoge_piyo_hage

この場合、タブを押す回数は2〜3度でよいのですが、もっと名前が重複する場合もあるし、そういったファイルに何度もアクセスする場合、面倒になります。

特に括弧とかスペースを含むファイル名を選ぶのは面倒くさくてしょうがねえっていう。

(まあvim内部のヒストリー使ったりとか、シェルのヒストリー使ったりしたらって話にもなるかと思いますが、それはおいといて)

ということで、フィルタリングソフトウェアのfzyによってインクリメンタルサーチを使って開きたいファイルを指定する方法を思いついたところ、かなり使い勝手が良かったのでお知らせします。

これはenhancdを使ってるといに思いつきました。

GitHub - b4b4r07/enhancd: A next-generation cd command with an interactive filter

まず、fzyをインストールします。

GitHub - jhawthorn/fzy: A better fuzzy finder

あとは

vi `ls | fzy`

とするだけで、その階層のファイル群がリストされるので、そのままタイプするとインクリメンタルサーチが出来て、選択したものが自動的にvimに渡されます。

.zshrc(.bashrc)には

alias vi='vim `ls | fzy`'

と書いておけばviと入力するだけでfzyを使ったファイルの選択画面に入ることができます。

こんな感じ

fzy_vi2

mvとかcpとかのファイル操作系のコマンドも、全部フィルタリングを使って実行できるようになるといいのになーと思うんだけど、対話的になると意味がない(面倒くさい)し…

と思いつつ作ってみた

#!/bin/bash

file=$(ls | fzy)
read -p "destination?:" dest
cp $file $dest

動くけど使える気がしない

ってなるとせいぜいこんな感じか

cp `ls | fzy` dest
※dest:保存場所

まあ括弧とかスペースとか混ざった日本語ファイルに対しては有効そうな。

と思ってスペース付きのファイルでやってみたら、ファイルネームのスペースがデリミタと認識されて動きませんでした。IFSでデリミタを変更してもいいのかも知れませんが、ちょっとそれはどうかと

色々試した結果、一旦ファイル名を変数に保存してやれば動きました

file=$(ls | fzy);echo $file | xargs -I@ cp @ dest

なんだこれっていうw

追記

このことを
dyama's pageの管理人のdyama氏に話したところ
こういうのどうかなってことで下記のスクリプトをご提案いただきました。

$ cp "$(ls | fzy)" $(cat)

このスクリプトを実行すると、最初にカレントディレクトリのリストを選択画面に入って、その後入力待ちの状態のときに新しく設定するファイル名を入力してC-d(ctrl+d)で抜けるとそのファイル名でコピーがなされます。

catの標準入力をそのまま標準出力とする機能を用いて実現している方法なので、ディレクトリの予測補完などが使えないのが玉にキズであるとはいえ、十分にシンプルで使えそうなものになりました。ありがとうdyama氏。

これをcpe(cp-extended)コマンドとかで登録しとくと、便利なときもあるかも知れないね!