- i=$(echo "$i" | sed -e 's/[\\|&]/\\&/g')
- if test $with_filename -eq 1; then
- sed_script="s|^[^:]*:|${i}:|"
- else
- sed_script="s|^|${i}:|"
- fi
- # Hack adapted from GPLed code at
- # http://home.comcast.net/~j.p.h/cus-faq-2
- # Has the same effect as the following two lines of bash:
- #
- # $grep $opt "$pat" | sed "$sed_script"
- # exit ${PIPESTATUS[0]}
- #
- # Inside the `...`, fd4 goes to the pipe whose other end is read
- # and passed to eval; fd1 is the normal standard output
- # preserved the line before with exec 3>&1
- exec 3>&1
- eval `
- exec 4>&1 >&3 3>&-
- {
- $grep $opt "$pat" 4>&-; echo "r=$?;" >&4
- } | sed "$sed_script"
- `
+ case $i in
+ (*'
+'* | *'&'* | *'\'* | *'|'*)
+ i=$(printf '%s\n' "$i" |
+ sed '
+ $!N
+ $s/[&\|]/\\&/g
+ $s/\n/\\n/g
+ ');;
+ esac
+ sed_script="s|^|$i:|"
+
+ # Fail if grep or sed fails.
+ r=$(
+ exec 4>&1
+ (eval "$grep" 4>&-; echo $? >&4) 3>&- | sed "$sed_script" >&3 4>&-
+ ) || r=2