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"