3

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.)

  • Does it need to be csh? Do you want to check if the string is contained in $mystr or if the two are identical? – terdon May 7 '14 at 18:05
  • @terdon Yes it does need to be csh, and I just want to check to see if there is a newline character in $mystr. – 2rs2ts May 7 '14 at 18:12
  • What? Do you want to check whether $mystr is/contains a specific multiline string or do you just need to check whether $mystr contains newline character(s)? The two are completely different. Please edit your question and clarify. – terdon May 7 '14 at 18:14
  • @terdon There, does that help? – 2rs2ts May 7 '14 at 18:23
  • I edited with what I think you mean. I beleive all you're looking for is the newline character, \n but have no csh knowledge so I don't know what the match syntax would be or even if csh can match. – terdon May 7 '14 at 18:26
5
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)

  • When I ps x I get -csh. Does that mean I'm not running tcsh, or does that not tell me anything? – 2rs2ts May 7 '14 at 19:13
  • 1
    Sorry, my bad, $var:q was already available in csh. I would still advise against using (t)csh for scripting though. – Stéphane Chazelas May 7 '14 at 19:17
  • No idea why you took the disclaimer out of your answer, it was actually pretty good advice. – Bratchley May 7 '14 at 19:23
  • I'm getting if: Badly formed number. I'm using it like so: if ($mystr:q !~ *'\ '*) then. Mind you can't see the newline... – 2rs2ts May 7 '14 at 19:24
  • @2rs2ts, try with the updated answer. – Stéphane Chazelas May 7 '14 at 19:45

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.