$/=\108; ($/) = (<> =~ /^.{105}(.?\r?\n?)/); seek ARGV, 0, 0; #### # Look ahead into the file for the ISA segment and the few characters which # follow it, so that we can determine the segment terminator character(s). $/ = \108; my $ISA_and_trailing_chars = <>; # examine the text after the segment for the segment termination character(s) $ISA_and_trailing_chars =~ / ^.{105} # The actual ISA segment, itself ( .? # The proper segment terminator character \r? # If the segment terminator is followed by a newline and/or \n? # carriage return, include that as part of the segment # terminator. this isn't really legal to do, but some # folks do it, regardless, and we want to be able to handle # that sort of garbage as though it weren't garbage. ) /x; my $segment_terminator = $1; # set the input record separator to the segment termination character(s), so # that subsequent reads from the file will read one segment at a time. $/ = $segment_terminator; # since we peeked ahead into the file, to determine *how* to read it, now # seek back to the beginning of it, so that we can read it (all) correctly seek ARGV, 0, 0; #### #!/bin/sh # since "perl -p ... -n ..." will be treated by perl as just # "perl -p ... ..." (not allowing the -n to override the -p) # we have to scan through any switches on the command line, # so that commands like "x12cat -ne 'print if /^PLB/' ..." # will work as expected... but still allow an implicit "-p" # if no "-n" is specified. Granted this isn't perfect... # But this isn't so bad, because an explicit "-p" can override # this. looptype="" for i do case "$i" in -m*) ;; # -m and -M start command-line "use" directives, -M*) ;; # "n"s in them should be ignored -*n*) looptype=n;; -h) echo 'x12cat: "magic" x12 spooler wrapper around command-line perl. -splits files by segment terminator -auto sets $f and $c to (regex-escaped) field and component separators -auto sets the autosplit to the field separator (for the -a autosplit) -allows -pe or -ne operations on file (or none at all to just cat the file)'; exit;; -*) ;; *) break;; esac done if [ "x$looptype" = "x" ]; then looptype=p fi perl -l -$looptype -e 'BEGIN{$SIG{PIPE}="exit"; $|=1; $/=\108; ($f,$c,$/)=(<> =~ /^ISA(.).{100}(.)(.?\r?\n?)/); ($f,$c)=("\Q$f","\Q$c"); seek ARGV,0,0; $.=0}' -F'/$f/' "$@" #### $ x12cat -ne 'print if /^GS/' some_file.x12 #### $ x12cat -ane '$paid += $F[4] if $F[0] eq "CLP"; END{print $paid}' some_835_file.x12 #### ------------ :Wq Not an editor command: Wq