Bash用于操作大括号分隔的配置文件

时间:2016-07-23 02:16:02

标签: regex linux bash awk sed

目前我有以下格式的配置文件:

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;
    }
  }
}

第一个问题:我想编写一组可以

的bash脚本
  1. 在文件中设置property = value;如果不存在则添加它。
  2. 从这样的文件中获取属性。
  3. 逐行编辑不适合:例如,以MaxIts为例,脚本需要区分Time.MaxItsTime.Implicit.MaxIts

    第二个问题:我想编写一个将上面转换为:

    的bash脚本
    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;
    

    这样sed或awk就能完成这项工作。

1 个答案:

答案 0 :(得分:2)

以下是第二部分:

$ 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;

我确信您可以编写一个脚本来执行反向映射,然后您可以在上面的平面格式上执行与您的第一个问题相关的所有操作。