xgrep
Unix Power Tools に掲載の xgrep を解読してみる。
#! /bin/sh # xgrep - print just the matches on separate lines # Written by Greg Ubben, DoD, 3 Feb 1994 if [ $# -eq 0 ]; then echo "Usage: $0 pattern [file...]" >&2 exit 2 fi re=$1; shift #x=`echo \\\02` # unlikely ^B will occur in the input x=`echo 2 | tr 2 \\\02` # use if your echo doesn't change \02 to ^B sed " \\$x$re$x!d s//$x&$x/g s/[^$x]*$x// s/$x[^$x]*$x/\\ /g s/$x.*// " "$@"
^B は印字不可文字を適当に選んだだけで、^A でも ^C でもいい(おそらく)。
\$x$re$x!d →最初のバックスラッシュにより、次の文字(^B)が正規表現の区切り文字になる。$re を含まない行を削除する。
s//$x&$x/g →前の置換と同じ語($re)を検索し、^B で挟む
s/[^$x]*$x// →行の最初の ^B までを削除する
s/$x[^$x]*$x/\\ →^B と ^B の間を改行に置換する
/g
s/$x.*// →^B 以降を削除する
# 例: # input--------------------------------- # that is a pen. that is a desk. # hi, tom # -------------------------------------- # $ xgrep is < input # -------------------------------------- # 1. \\$x$re$x!d により2行目削除 # that is a pen. that is a desk. # -------------------------------------- # 2. s//$x&$x/g により # that ^Bis^B a pen. that ^Bis^B a desk. # -------------------------------------- # 3. s/[^$x]*$x// により # is^B a pen. that ^Bis^B a desk. # -------------------------------------- # 4. s/$x[^$x]*$x/\\ # /g により # is # is^B a desk. # -------------------------------------- # 5. s/$x.*// により # is # is