使用 bash 脚本编辑多行文本文件

Edit multiple lines of text file using bash script

我想运行 CFD 模拟分为两个步骤。第一步结束后,我需要更改一个文本文件(与边界条件相关 - CFD 术语)并重新 运行 进一步的案例,即第 2 步。

直到现在,我都是手动执行此操作并且浪费了很多时间来 运行 整夜和周末进行模拟。

那么,是否可以使用 bash 脚本编辑文本文件?

示例: 我的文件结构:

试运行

TestRun(主文件夹)由一个子文件夹 (Folder1) 组成,Folder1 有一个要由 bash 脚本编辑的文本文件 (TextFile1)。

TextFile1 的内容(例如):

internalField nonuniform List<scalar>
7
(
0
1
2
3
4
5
6
);
boundaryField
{
 left
 {
  type fixedValue;
  value uniform 1;
 }
}

现在,bash 文件应将文件更改为:

internalField nonuniform List<scalar>
7
(
0
1
2
3
4
5
6
);
boundaryField
{
 left
 {
  type groovyBC;
  valueExpression "-pc";
  variables       "pc@left=pc;";
  value           uniform 0;
 }
}

请注意,要编辑的行数超过1,具体行号我不知道。我确实遇到过一些使用 sed 编辑特定行号的帖子。

在我的例子中,我必须找到单词 "left"(如 vim: /left)并替换搜索单词后“{ }”之间的行。

想当然地"left"这个词只会在文件中出现一次,你可以使用这个脚本来执行你想要的编辑:

#!/bin/bash
#
insideleft='false'
while read line
do
    # using grep -c to make sure it matches even if there are spaces
    if [ $(echo $line | grep -c left) -eq 1 ]
    then
        insideleft='true'
        cat <<HEREDOC
  left
  {
    type groovyBC;
    valueExpression "-pc";
    variables       "pc@left=pc;";
    value           uniform 0;
  }
HEREDOC
    else
        if [ $insideleft == 'false' ]
        then
            echo $line
        else
            if [ $(echo $line | grep -c '}') -eq 1 ]
            then
                insideleft='false'
            fi
        fi
    fi
done <data

基本上,找到行 "left" 后,输出新文本,并循环遍历输入文件行,直到找到 },关闭左侧部分。我用你的输入和输出样本试过了,效果很好。

注意:最后一行"data"是你要修改的文件名