首页 > 解决方案 > 使用 sed 替换 while read 循环中的单行

问题描述

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

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

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

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

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

标签: bashtextsedreplacewhile-loop

解决方案


你有几个问题。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(请参见此处...


推荐阅读