No estoy seguro de cómo expresar esto usando la csh
sintaxis 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 sed
comando, 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 csh
que tcsh
se 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
csh
La mayoría de la gente ya ha dejado de intentar escribir guiones fiables . ¿Por qué lo usarías csh
en 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`
csh
almacena cada palabra (separada en espacios en blanco) de la salida de some command
en varios elementos de la var
matriz.
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 csh
las implementaciones/versiones)