なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

UNIXコマンドで作業を効率化

三種のコマンド:awk, sed, grep
および find, xargs, tr, sort, uniq etc. etc.
そんなコマンドを皆さん使いこなしていることだろうと思う。

sedでなんでもやる

sedで検索してたら恐ろしいものを見つけた。sedで他のUNIXコマンドを代用するというものだ。
SED emulating UNIX commands

これで常時オフラインの超絶クソ環境に閉じ込められても作業できるね!

以下コピー

 UNIX         |  SED
 -------------+----------------------------------------------------------------
 cat          |  sed ':'
 cat -s       |  sed '1s/^$//p;/./,/^$/!d'
 tac          |  sed '1!G;h;$!d'
 grep         |  sed '/patt/!d'
 grep -v      |  sed '/patt/d'
 head         |  sed '10q'
 head -1      |  sed 'q'
 tail         |  sed -e ':a' -e '$q;N;11,$D;ba'
 tail -1      |  sed '$!d'
 tail -f      |  sed -u '/./!d'
 cut -c 10    |  sed 's/\(.\)\{10\}.*/\1/'
 cut -d: -f4  |  sed 's/\(\([^:]*\):\)\{4\}.*/\2/'
 tr A-Z a-z   |  sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'
 tr a-z A-Z   |  sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
 tr -s ' '    |  sed 's/ \+/ /g'
 tr -d '\012' |  sed 'H;$!d;g;s/\n//g'
 wc -l        |  sed -n '$='
 uniq         |  sed 'N;/^\(.*\)\n\1$/!P;D'
 rev          |  sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
 basename     |  sed 's,.*/,,'
 dirname      |  sed 's,[^/]*$,,'
 xargs        |  sed -e ':a' -e '$!N;s/\n/ /;ta'
 paste -sd:   |  sed -e ':a' -e '$!N;s/\n/:/;ta'
 cat -n       |  sed '=' | sed '$!N;s/\n/ /'
 grep -n      |  sed -n '/patt/{=;p;}' | sed '$!N;s/\n/:/'
 cp orig new  |  sed 'w new' orig
 hostname -s  |  hostname | sed 's/\..*//'

xargsのより有効な使い方

またもやStackOverflow
bash - How to use > in an xargs command? - Stack Overflow

この技法を使えばこんなことができる(=> 定型文を特定の拡張子のファイルにコピーする)
$ find ./ -name \*.cpp -print | xargs -I{} sh -c "cat COPYING > '{}'"
一括リネーム
$ find . -name Makefile -print | xargs -I{} sh -c "dirname '{}'" | xargs -I{} sh -c "mv '{}'/Makefile '{}'/osask.mk"