Ich bin nicht sicher, wie ich das mit der csh
String-Matching-Syntax ausdrücken soll. Ich möchte testen, ob eine CSH-Variable eine neue Zeile enthält. Ich suche im Wesentlichen nach:
if ($mystr !~ <pattern for strings which contain a newline character>)
Bearbeiten:in meinem speziellen Fall versuche ich, eine Zeichenfolge wie diese zu übergeben:
1234ABC
Und eine Zeichenfolge wie diese schlägt fehl:
1234ABC
-------
FOOBAR
Dies ist die Ausgabe eines sed
Befehls, nämlich sed '1d;$d'
. Ich bin nicht sicher, ob das wichtig ist.
Der Grund, warum ich versuche, Zeilenumbrüche zu erkennen, " -------"
ist der Schutz vor Änderungen in der Formatierung der Datei, die ich analysiere. (Ich glaube sowieso nicht, dass es wichtig ist, was ich genau mit der Datei mache, da ich nur nach einer allgemeinen Lösung zum Erkennen eines Zeilenumbruchzeichens suche.)
Antwort1
if ($mystr:q =~ *'\
'*) echo yes
sollte in einigen Implementierungen und Versionen von funktionieren ( csh
wie in Debian). In einigen anderen (wie in Solaris 10) haben Sie möglicherweise mehr Glück mitcsh
tcsh
set nl = '\
'
if ($mystr:q =~ *$nl:q*) echo yes
csh
Die meisten Leute haben es mittlerweile aufgegeben, zuverlässige Skripte mit zu schreiben . Warum sollte man csh
in diesem Jahrhundert noch verwenden?
Dieser Code funktioniert für mich (Ausgaben no
) intcsh 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
Beachten Sie in diesem Fall Folgendes:
set var = `some command`
csh
speichert jedes Wort (durch Leerzeichen getrennt) der Ausgabe some command
in mehreren Elementen des var
Arrays.
Mit:
set var = "`some command`"
Es speichert jede nicht leere Zeile in Elementen des Arrays.
Es sieht so aus, als ob man die Ausgabe eines Befehls nicht vollständig in einer Variablen in speichern kann(t)csh
. Ihre einzige Option wäre also:
set var = "`some command`" # note that it removes the empty lines
if ($#var == 1)...
1 Streng genommen stimmt das nicht, man könnte so etwas tun wie:
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
(natürlich funktioniert es möglicherweise nicht in allen csh
Implementierungen/Versionen)