C-Shell-Skriptbedingung für „Wenn Zeichenfolge ein Zeilenumbruchzeichen enthält“

C-Shell-Skriptbedingung für „Wenn Zeichenfolge ein Zeilenumbruchzeichen enthält“

Ich bin nicht sicher, wie ich das mit der cshString-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 sedBefehls, 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 ( cshwie in Debian). In einigen anderen (wie in Solaris 10) haben Sie möglicherweise mehr Glück mitcshtcsh

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

cshDie meisten Leute haben es mittlerweile aufgegeben, zuverlässige Skripte mit zu schreiben . Warum sollte man cshin 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`

cshspeichert jedes Wort (durch Leerzeichen getrennt) der Ausgabe some commandin mehreren Elementen des varArrays.

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 cshImplementierungen/Versionen)

verwandte Informationen