2016-07-23 24 views
-2

Derzeit ich eine Config-Datei die folgende Form haben:Bash für geschweifte Klammer Manipulation begrenzt Konfigurationsdateien

under Time { 
    TimeStep = 0.001; 
    MaxTime = 0.2; 
    MaxIts = 400; 
    Type = Implicit; 
    under Implicit { 
    Type = ForwardEuler; 
    Jacobian = FiniteDifference; 
    under Newton { 
     MaxIts = 20; 
     Eps = 0.01; 
    } 
    } 
} 

Erste Frage: Ich möchte eine Reihe von Bash-Skripte schreiben, kann

  1. Set Eigenschaft = Wert in einer Datei; füge es hinzu, wenn es nicht da ist.
  2. erhalten Eigenschaft aus einer solchen Datei.

line-by-line editting hier nicht geeignet ist: MaxIts zum Beispiel, müssen Sie das Skript zwischen Time.MaxIts und Time.Implicit.MaxIts unterscheiden.

Zweite Frage: Ich möchte ein Bash-Skript schreiben, die oben in transformiert:

Time.TimeStep = 0.001; 
Time.MaxTime = 0.2; 
Time.MaxIts = 400; 
Time.Type = Implicit; 
Time.Implicit.Type = ForwardEuler; 
Time.Implicit.Jacobian = FiniteDifference; 
Time.Implicit.Newton.MaxIts = 20; 
Time.Implicit.Newton.Eps = 0.01; 

so dass sed oder awk tun können, einfach den Job.

+2

Und was hast du bisher versucht? Wo steckst du fest? – dimo414

+1

Im Gegensatz zu dem, was Sie zu glauben scheinen, ist StackOverflow kein kostenloser Codierungsdienst. Es wird erwartet, dass Sie Ihren Code zusammen mit relevanten Beispieleingaben, erwarteten Ausgaben (was Sie getan haben), tatsächlichen Fehlermitteilungen sowie Ihren Kommentaren darüber, wo Sie steckenbleiben, zeigen. Bitte zeigen Sie Ihre besten Bemühungen, um dieses Problem zu lösen (verwenden Sie das Tool {} oben links im Eingabefeld, um code/data/output/errMsgs korrekt zu formatieren), und die Leute können Ihnen vielleicht helfen. Viel Glück. – shellter

+1

Auch die obige Syntax für die geschweifte Klammer ist keine [reguläre Sprache] (https://en.wikipedia.org/wiki/Regular_language), daher ist es nicht möglich, mit regulären Ausdrücken zu analysieren. – dimo414

Antwort

2

Hier ist, wie der zweiten Teil zu tun:

$ cat tst.awk 
function descend(name) { 
    while ((getline > 0) && !/}/) { 
     if (/{/) { 
      descend(name "." $2) 
     } 
     else { 
      sub(/^[[:space:]]+/,"") 
      print name "." $0 
     } 
    } 
} 
{ descend($2) } 

$ awk -f tst.awk file 
Time.TimeStep = 0.001; 
Time.MaxTime = 0.2; 
Time.MaxIts = 400; 
Time.Type = Implicit; 
Time.Implicit.Type = ForwardEuler; 
Time.Implicit.Jacobian = FiniteDifference; 
Time.Implicit.Newton.MaxIts = 20; 
Time.Implicit.Newton.Eps = 0.01; 

Ich bin sicher, dass Sie ein Skript schreiben, können die umgekehrte Zuordnung zu tun, und dann können Sie einfach die ganze Manipulation auf Ihre erste Frage auf dem flachen Zusammenhang tun Format oben.

Verwandte Themen