Condición de script de C Shell para si la cadena contiene un carácter de nueva línea

Condición de script de C Shell para si la cadena contiene un carácter de nueva línea

No estoy seguro de cómo expresar esto usando la cshsintaxis de coincidencia de cadenas. Quiero probar si una variable csh contiene una nueva línea. Básicamente estoy buscando:

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

Editar:En mi caso particular, estoy tratando de hacer pasar una cadena como esta:

1234ABC

Y una cadena como esta falla:

1234ABC
 -------
FOOBAR

Estos son el resultado de un sedcomando, a saber sed '1d;$d'. No estoy seguro si eso importa.

La razón por la que intento detectar nuevas líneas en lugar de hacerlo " -------"es para defenderme contra cambios en el formato del archivo que estoy analizando. (De todos modos, no creo que importe exactamente lo que esté haciendo con el archivo, ya que solo estoy buscando una solución general para detectar un carácter de nueva línea).

Respuesta1

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

debería funcionar en algunas implementaciones y versiones de csh(como las cshque tcshse encuentran en Debian). En algunos otros (como el que se encuentra en Solaris 10), es posible que tengas más suerte con

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

cshLa mayoría de la gente ya ha dejado de intentar escribir guiones fiables . ¿Por qué lo usarías cshen este siglo?

Este código funciona para mí (salidas no) entcsh 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

Tenga en cuenta que si lo hace:

set var = `some command`

cshalmacena cada palabra (separada en espacios en blanco) de la salida de some commanden varios elementos de la varmatriz.

Con:

set var = "`some command`"

almacena cada línea no vacía en elementos de la matriz.

Parece que no se puede almacenar la salida de un comando completa en una variable (t)csh, por lo que su única opción sería:

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

1 Estrictamente hablando, eso no es cierto, se podría hacer 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

(por supuesto, es posible que no funcione en todas cshlas implementaciones/versiones)

información relacionada