bash - 使用 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);
}
帮我堆栈溢出,你是我唯一的希望。
解决方案
你有几个问题。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(请参见此处...)
推荐阅读
- javascript - CKEditor 数据不会在 Firestore 中上传 TypeError: text is not a function
- java - 应用 gradle 自定义模块插件
- php - DarkaOnLine / L5-Swagger 与 Datadog 冲突
- javascript - 如何使用for循环javascript找到n的平方
- ios - PencilKit 绘图有时会在黑暗模式下变为黑色
- pine-script - 根据净值损失百分比创建止损(回撤)
- gstreamer - 未能延迟将名为 rtspsrc0 的 GstRTSPSrc 的某个焊盘链接到名为 rtpjitterbuffer0 的 GstRtpJitterBuffer 的某个焊盘
- pyspark - 如果 sparksession 没有关闭会发生什么?
- python - Python Selenium Click Div 末尾有空格
- amazon-dynamodb - 如何在生产中运行的 dynamo DB 中引入新列?