Regular Expressions

Hi,
below is a piece of code written by my predecessor at work.
I'm kind of a newbie and am trying to figure out all the regular expressions in this piece of code.
It is really a tough time for me to figure out all the regular expressions.

Please shed some light on the regular expressions in this code

ssh_list() {
typeset userAtHost="$1"
typeset dir="${2-.}"
typeset wild="${3-*}"

info "SSH list: $userAtHost $src $dst"

if [ "$REGION" != prod ] ;then
userAtHost=$LOGNAME@localhost
fi

\# Save, disable, and restore the verbose flag - any
\# verbose output would look like errors.
typeset verbose="$\(set -o |sed -n 's/^verbose *//p'\)"
set \+v
typeset msgs="$\(sftp $userAtHost 2>&1 <<EOF

cd $dir
ls
EOF)"
if [ "$verbose" = on ] ;then
set -v
fi

\# Strip the "Connecting to host..." line, prompts, blank lines
\# and login banners. What's left should only be error messages.
typeset errs="$\(echo "$msgs" |
    sed -e '/^Connecting to .*\\.\\.\\.$/d' \\
     -e 's/sftp > //g' \\
     -e '/^[ ]*$/d' \\
     -e '/^\#/d' \\
     -e '/^[-dDlbcps][-rwxsStTlL]\\\{9\\\}\+\\\{0,1\\\} /d'\)"

if [ "$errs" != "" ] ;then
    error "$errs"
    return 1
fi

echo "$msgs" |
while read line
do
case "$line" in -*\\ $wild\)
echo $\{line\#\#* \}
;;esac
done

return 0

}

I'd like some explanation of these lines.... gurus please shed some light.

Thank you for your time.
Ram

This one even has a comment to explain what it does. It disables verbose debugging (disables set -v if set), remembering the previous state of the flag in the verbose variable.

Again, the comments are probably better than any detailed attempt at going through the individual regular expressions. Any "Connecting to ..." line is removed. Any sftp> prompt is removed. Any empty line is removed. Any line beginning with a hash sign is removed. The last one looks vaguely like it's intended to remove directory listing output.

This prints any line from $msgs which matches a dash, followed by anything, followed by a space, followed by the value of the variable $wild, with everything up to the last space trimmed away. (None of this involves any regular expressions, strictly speaking; both the case statement and the ${var##subst} interpolation work with glob patterns.)

$wild is defined up at the beginning of the function as either positional argument $3 or (if that is empty) an asterisk, which matches anything in glob wildcard notation.


  1. ↩︎

  2. -dDlbcps ↩︎

Get yourself a copy of Mastering Regular Expressions by Jeffrey Friedl. You'll benefit quite a bit from it.

Shawn

The script however works fine on sunSSH
It does not work on an OPEN SSH, I tries to tweak in a little more with the regular expressions... but it still does not help.
Any idea how to overcome this problem.
when I execute the same script on OPEN SSH box here is the error I get.
If I logon interactively from the OPEN SSH box and execute the commands one by one, they work. when they are placed in a script the script doesnot work.any help is appreciated.

INFO: SSH list: user@host outgoing x001_ameint_*.zip
ERROR: #^M
ERROR: #==============================================^M
ERROR: #Bowne Marketing & Business Communications^M
ERROR: #SFTP Server (PCN)^M
ERROR: #==============================================^M
ERROR: #^M
ERROR: ^M
ERROR: sftp> sftp> drwx------ 0 0 0 0 May 21 15:25 .
ERROR: drwx------ 0 0 0 0 Mar 17 11:58 ..
ERROR: drwx------ 0 0 0 0 May 21 15:59 archive
ERROR: -rw------- 0 0 0 4152 May 9 11:44 x001_REPORTS_ameint_AIGODN00857.zip
ERROR: -rw------- 0 0 0 42138973 May 19 14:16 x001_ameint_BP010F0010_00002_003.zip.done
ERROR: -rw------- 0 0 0 377449320 Apr 14 14:20 x001_ameint_BP010F0010_00264_001.zip.done
ERROR: -rw------- 0 0 0 637950 May 21 13:40 x001_ameint_abc.zip
ERROR: -rw------- 0 0 0 408 May 21 13:49 x001_ameint_def.zip
ERROR: -rw------- 0 0 0 408 May 21 13:53 x001_ameint_xyz.zip
ERROR: sftp> Invalid command.^M
ERROR: sftp>

here are my tweaked regular expressions:
ssh_list() {
typeset userAtHost="$1"
typeset dir="${2-.}"
typeset wild="${3-*}"

    info "SSH list: $userAtHost $dir $wild"

    \# Save, disable, and restore the verbose flag - any
    \# verbose output would look like errors.
    typeset verbose="$\(set -o |sed -n 's/^verbose *//p'\)"
    set \+v
    typeset msgs="$\(sftp $userAtHost 2>&1 <<EOF
    cd $dir
    ls -l
    EOF\)"

     echo $msgs > TEXT.dat

    if [ "$verbose" = on ] ;then
    set -v
    fi

    \# Strip the "Connecting to host..." line, prompts, blank lines
    \# and login banners. What's left should only be error messages.
    typeset errs="$\(echo "$msgs" |
            sed -e '/^Connecting to .*\\.\\.\\.$/d' \\

# -e '/^ERROR: unable to initialize mechanism library [/usr/lib/gss/gl/mech_krb5.so]/d' \
-e '/ERROR: //g' \
-e 's/^$//g' \
-e 's/sftp> //g' \
-e '/^[ ]*$/d' \
-e '/^#/d' \
-e '/^[-dDlbcps][-rwxsStTlL]\{9\}+\{0,1\} /d')"

    if [ "$errs" != "" ] ;then
            error "$errs"
            return 1
    fi

    echo "$msgs" |
    while read line
    do
    case "$line" in -*\\ $wild\)
    echo $\{line\#\#* \}
    ;;esac
    done

    return 0

}

ssh_sendrecv() {
typeset op="$1"
typeset userAtHost="$2"
typeset src="$3"
typeset dst="$4"

    info "SSH transfer: $op $userAtHost $src $dst"

    \#if [ "$REGION" != prod ] ;then
    \#userAtHost=$LOGNAME@localhost
    \#fi


    \# Save, disable, and restore the verbose flag - any
    \# verbose output would look like errors.
    typeset verbose="$\(set -o |sed -n 's/^verbose *//p'\)"
    set \+v
    typeset msgs="$\(sftp $userAtHost 2>&1 <<EOF

$op $src $dst
EOF)"
if [ "$verbose" = on ] ;then
set -v
fi

    \# Strip the "Connecting to host..." line, prompts, blank lines
    \# and login banners.  What's left should only be error messages.
    typeset errs="$\(echo "$msgs" |
            sed -e '/^Connecting to .*\\.\\.\\.$/d' \\
                -e 's/^$//g' \\
                -e 's/sftp> //g' \\
                -e '/^[     ]*$/d' \\
                -e '/^\#/d'\)"

    if [ "$errs" != "" ] ;then
            error "$errs"
            return 1
    fi

    return 0

}