在读取循环时使用sed替换单行输入

时间:2018-06-21 14:46:51

标签: bash text sed replace while-loop

我需要设置bash脚本来初始化文件中某些BC的帮助。理想情况下,我的程序将遍历每一行并:
1)读入BC类型-(壁,出口,入口)。
2)根据适当的BC类型更改“类型”字段。

不幸的是,我的程序似乎替换了步骤2中的所有类型字段,而不仅仅是与正确的BC相关联的类型字段。

我认为这与在整个文件而不是$ line变量上运行的sed命令有关。

while IFS= read -r line || [[ -n "$line" ]]; do                                         #go through each line of T2 file
        if [[ $line == *wall_* ]]                               #if wall_*
        then
                echo "attempted to assign wall_*"
                var=1 #wall                                     #Go down 2 lines
        elif [[ $line == *velocity-inlet* ]]
        then
                echo "attempted to assign outflow"
                var=2 #inlet
        elif [[ $line == *outflow* ]]
        then
                var=3 #outlet
        fi
        echo $var
        if [[ $line == *type* && $var == 1 ]]
        then
                sed -i 's/.*type.*/type                 zeroGradient/' 0/T3
                echo "Attempted wall zeroGradient"
        elif [[ $line == *type* && $var == 2 ]]
        then
                sed -i 's/.*type.*/type                 fixedValue\nvalue               uniform (3 0 0)/' 0/T3

        elif [[ $line == type* && $var == 3 ]]
        then
                sed -i 's/.*type.*/type                 zeroGradient/' 0/T3

        fi
        sed -i '/nFaces*/d' 0/T3                        #Deletes irrelevant stuff from boundary file copy
        sed -i '/startFace*/d' 0/T3
done <0/T3.

例如,应该更改它:

velocity-inlet_1  
{   
    type            patch;  
    nFaces          336;  
    startFace       75515;  
}  
outflow_2    
{  
    type            patch;  
    nFaces          136;  
    startFace       75851;  
}   

收件人:

velocity-inlet_1  
    {  
        type            fixedValue;  
        value           uniform (3 0 0);  
    }  
    outflow_2  
    {  
        type            zeroGradient;
    }  

但是将其更改为错误地将其更改为:

velocity-inlet_1
    {
        type            fixedValue;
        value           uniform (3 0 0);
    }
    outflow_2
    {
        type            fixedValue;
        value           uniform (3 0 0);
    }

帮我堆栈溢出,你是我唯一的希望。

1 个答案:

答案 0 :(得分:0)

您遇到了一些问题。 sed默认情况下会影响整行,而您首先并没有告诉它要修改哪一行。您还在读取文件时对其进行了修改。我可能会喜欢这样的东西:

var="none"
while IFS= read -r line; do
        if [[ "$line" =~ "wall" ]]; then
             var=wall
        elif [[ "$line" =~ "velocity-inlet" ]]; then
             var=inlet
        fi

        if [[ "$line" =~ "type" && "$var" == "wall" ]]; then
              echo "$line" | sed 's|\(type *\).*|\1zeroGradient|'
        elif [[ "$line" =~ "type" && "$var" == "inlet" ]]; then
              echo "$line" | sed 's|\(type *\).*|\1uniform (3 0 0)|'
        else
              echo "$line"
        fi
done

然后做

 script.sh < 0/T3 > 0/T3.mod

您当然可以将其修改为也可以从特定文件读取/写入,并且可以避免sed(请参见here...