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