以下の内容はhttps://m-hiyama.hatenablog.com/entry/20160331/1459396420より取得しました。


headコマンドを、Emacsのgrepモードで使う

かなりたくさんのファイルがあって、それらの先頭の数行を眺めたい -- そんなときは、headコマンドとlessコマンドを繋げばいいでしょう; head * | less 。

眺めるだけじゃなくて編集もしたいときは、エディタ内からheadコマンドを実行したいですね。僕はEmacsを使っているので、Emacs内からheadしたいわけです。

話を具体的にするために、次の状況を想定します。

  • 僕(檜山)のはてなダイアリーの記事が hatena-*.txt というファイルに入っている。
  • それらの記事の先頭部分を列挙したい。
  • 先頭部分を眺めて、必要があれば編集をしたい。

サンプルには4つのファイルしかありません(↓)が、実際にはたくさんのファイルを相手にしてます。


$ ls hatena-*.txt
hatena-2016-03-23.txt hatena-2016-03-26.txt
hatena-2016-03-25.txt hatena-2016-03-30.txt

$

これから使うEmacsのM-x grepの機能と使い方については次の記事を参照してください。

M-x grepは、grepに限らずどんなコマンでも実行できます。M-x grep C-a C-k の後に任意のコマンドラインを入力すればいいのです。コマンドとして、head -n 5 hatena-*.txt とか入力すれば、headの出力がgrepバッファ(バッファ名*grep*)に取り込まれます。

しかし、headの出力はgrepの出力とフォーマットが違うので、C-x ` (next-error)などgrepモードの機能が動きません。headの出力をsedで加工すればいいでしょう。

  • head -n 5 head -n 5 hatena-*.txt | sed -e "s/^==> \(.*\) <==$/\1:1:/"

毎回このパイプラインを手で書くのは大変なので、シェルスクリプト、またはバッチファイルにしておきます(コマンドライン引数がないときと、単一ファイルが引数となる場合も考慮してます)。

#!/bin/sh
if [ "$1" = "" ]; then exit 1; fi
head -n 5 -v  $* | sed -e "s/^==> \(.*\) <==$/\1:1:/"
@echo off
if "%1" == "" exit /b 1
head -n 5 -v  %1 | sed -e "s/^==> \(.*\) <==$/\1:1:/"

このスクリプトをghead(grep風head)という名前で呼び出せるとして、M-x grep C-a C-k ghead hatena-*.txt でgrepバッファが使えるようになります。grepバッファ内でファイル群の先頭部分を読んでいって、必要があれば当該ファイルを開いて編集ができます。




以上の内容はhttps://m-hiyama.hatenablog.com/entry/20160331/1459396420より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14