Stupid sed question

Paul John Falstad pfalstad at screen.Princeton.EDU
Sat Oct 27 10:30:23 AEST 1990


In article <118 at mq.com> alan at mq.com (Alan H. Mintz) writes:
>(Hmmm. Hard to tell if this is the right group nowadays :)
>
>I'm trying to write a script to edit the /etc/ttytype file under XENIX. The
>idea is to search the file for the line for a given port and alter the
>terminal type associated with it. The ttytype file consists of lines
>like:
>
>wy60ak	ttya1
>svt1210	ttya2
>ansi	ttya3
>
>The separator between the fields is a tab character (\011, 0x09). So,

>tty='ttya1'
>ttytype='vt100n'
>
>line=`fgrep $tty /etc/ttytype`
>cat /etc/ttytype | sed "s/$line/$ttytype	$tty/" >tempfile
>#		This is a tab -----------^^^^^^

>This works great, if the file does not contain another terminal that starts
>with ttya1 (like ttya10):
>
>ansi	ttya1
>ansi	ttya10
>
>In this case, sed barfs with "command" garbled. What am I missing here ? I 

When there are two terminals that contain the string ttya1, $line is
being set to "ansi ttya1\nansi ttya10", since the output of fgrep has
two lines.  So sed sees this as its command:

s/ansi ttya1
ansi ttya10/vt100n ttya1/

which is garbled, since the first line has no ending delimiter.  Try
something like this instead:

line=`grep "[TAB]$tty$" /etc/ttytype`
cat /etc/ttytype | sed "s/$line/$ttytype $tty/" >tempfile

or better, replace both lines with:

sed "/[TAB]$tty\$/s/.*[TAB]/$ttytype[TAB]/" /etc/ttytype >tempfile

If you actually have more fields after the tty name, you may have to
change the \$ to another tab.

--
Paul Falstad, pfalstad at phoenix.princeton.edu PLink:HYPNOS GEnie:P.FALSTAD
"Your attention please.  Would the owner of the Baader-Meinhof shoulder-bag
which has just exploded outside the terminal please pick up the white
courtesy phone."



More information about the Comp.unix.shell mailing list