Condição de script C Shell para se a string contiver um caractere de nova linha

Condição de script C Shell para se a string contiver um caractere de nova linha

Não sei como expressar isso usando a cshsintaxe de correspondência de strings. Quero testar se uma variável csh contém uma nova linha. Estou basicamente procurando:

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

Editar:no meu caso particular, estou tentando fazer com que uma string como esta passe:

1234ABC

E uma string como esta falha:

1234ABC
 -------
FOOBAR

Estas são a saída de um sedcomando, nomeadamente sed '1d;$d'. Não tenho certeza se isso importa.

A razão pela qual estou tentando detectar novas linhas " -------"é para me defender contra alterações na formatação do arquivo que estou analisando. (De qualquer forma, não acho que importe exatamente o que estou fazendo com o arquivo, pois estou apenas procurando uma solução geral para detectar um caractere de nova linha.)

Responder1

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

deve funcionar em algumas implementações e versões csh(como as cshencontradas tcshno Debian). Em alguns outros (como o encontrado no Solaris 10), você pode ter mais sorte com

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

A maioria das pessoas já desistiu de tentar escrever scripts confiáveis csh. Por que você usaria cshneste século?

Este código funciona para mim (saídas no) emtcsh 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

Observe que se você fizer isso:

set var = `some command`

csharmazena cada palavra (separada em branco) da saída some commandem vários elementos do vararray.

Com:

set var = "`some command`"

ele armazena cada linha não vazia em elementos do array.

Parece que não é possível armazenar a saída de um comando inteiro em uma variável (t)csh, então sua única opção seria:

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

1 A rigor, isso não é verdade, alguém poderia fazer algo como:

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

(claro, pode não funcionar em todas cshas implementações/versões)

informação relacionada