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