C Shell – Condition for If String Contains a Newline Character

cshstring

I'm not sure how to express this using the csh string matching syntax. I want to test whether a csh variable contains a newline. I'm basically looking for:

if ($mystr !~ <pattern for strings which contain a newline character>)

Edit: in my particular case, I am trying to make a string like this pass:

1234ABC

And a string like this fail:

1234ABC
 -------
FOOBAR

These are the output of a sed command, namely sed '1d;$d'. Not sure if that matters.

The reason why I am trying to detect newlines rather than " -------" is for defense against changes in the formatting of the file I'm parsing. (Anyway, I don't think it matters what I'm doing with the file exactly, since I'm just looking for a general solution for detecting a newline character.)

Best Answer

if ($mystr:q =~ *'\
'*) echo yes

should work in some implementations and versions of csh (like the csh and tcsh ones found on Debian). In some others (like the one found on Solaris 10), you may have better luck with

set nl = '\
'
if ($mystr:q =~ *$nl:q*) echo yes

Most people have given up trying to write reliable scripts with csh by now. Why would you use csh in this century?

This code works for me (outputs no) in tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,color,filec

set mystr = '1234ABC\
 -------\
FOOBAR'
if ($mystr:q !~ *'\
'*) then
  echo yes
else
  echo no
endif

Note that if you do:

set var = `some command`

csh stores each word (blank separated) of the output of some command in several elements of the var array.

With:

set var = "`some command`"

it stores each non-empty line in elements of the array.

It looks like one cannot1 store the output of a command whole into a variable in (t)csh, so your only option would be:

set var = "`some command`" # note that it removes the empty lines
if ($#var == 1)...

1 Strictly speaking, that's not true, one could do something like:

set x = "`some command | paste -d. /dev/null -`"
set var = ""
set nl = '\
'

foreach i ($x:q)
  set i = $i:s/.//:q
  set var = $var:q$i:q$nl:q
end

(of course, it may not work in all csh implementations/versions)

Related Question