C A condição de script do shell para if string contém um caractere de nova linha

3

Não sei como expressar isso usando a sintaxe de correspondência de sequência csh . Eu 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 uma string como esta:

1234ABC

E uma string como essa falha:

1234ABC
 -------
FOOBAR

Estes são os resultados de um comando sed , a saber, sed '1d;$d' . Não tenho certeza se isso é importante.

O motivo pelo qual estou tentando detectar novas linhas em vez de " -------" é para defesa contra alterações na formatação do arquivo que estou analisando. (De qualquer forma, não acho que seja importante o que estou fazendo com o arquivo exatamente, já que estou apenas procurando uma solução geral para detectar um caractere de nova linha.)

    
por 2rs2ts 07.05.2014 / 19:50

1 resposta

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

deve funcionar em algumas implementações e versões de csh (como os csh e tcsh encontrados 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 desistiu de tentar escrever scripts confiáveis com csh até agora. Por que você usaria csh neste século?

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

Observe que, se você fizer isso:

set var = 'some command'

csh armazena cada palavra (separada em branco) da saída de some command em vários elementos da matriz var .

Com:

set var = "'some command'"

armazena cada linha não vazia em elementos da matriz.

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

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

1 Estritamente falando, isso não é verdade, pode-se 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 as implementações / versões csh )

    
por 07.05.2014 / 21:11

Tags