Não sei como expressar isso usando a csh
sintaxe 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 sed
comando, 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 csh
encontradas tcsh
no 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 csh
neste 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`
csh
armazena cada palavra (separada em branco) da saída some command
em vários elementos do var
array.
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 csh
as implementações/versões)