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

使用bash脚本编辑多行文本文件,bash,textedit,Bash,Textedit,我想运行一个CFD模拟,分为两个步骤。在第一步结束后,我需要更改与边界条件相关的文本文件-CFD术语,并进一步重新运行案例,即第2步 直到现在,我都是手工操作,浪费了很多时间在夜间和周末进行模拟 那么,是否可以使用bash脚本编辑文本文件 例如: 我的文件结构: 试运行 折叠1 -文本文件1 TestRun主文件夹由一个子文件夹Folder1组成,Folder1有一个文本文件要由bash脚本编辑TextFile1 TextFile1的内容,例如: internalField nonuniform

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

直到现在,我都是手工操作,浪费了很多时间在夜间和周末进行模拟

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

例如: 我的文件结构:

试运行

折叠1

-文本文件1

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编辑一个特定行号的帖子


在我的情况下,我必须在vim:/left中找到单词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
基本上,一旦找到左行,输出新文本,循环输入文件行,直到找到},关闭左部分。我用你的输入输出样本试过了,效果很好


注意:在最后一行中,数据是您要修改的文件名。

该单词是否还有其他实例,或者我们是否可以假设它在该上下文中只出现一次?@Nic3500它在整个文本文件中只出现一次。这在我的输出文本文件中是一个正数。忘了提了!!谢谢,我发布了一个可以正常工作的脚本。我如何覆盖该文件?当然,我会保留一份原始的副本,因为您共享的bash脚本会将文本输出到屏幕上。啊,是的。假设您调用脚本edit.bash。按如下方式运行:edit.bash>output_file.txt。