使用 bash 脚本编辑多行文本文件
Edit multiple lines of text file using bash script
我想运行 CFD 模拟分为两个步骤。第一步结束后,我需要更改一个文本文件(与边界条件相关 - CFD 术语)并重新 运行 进一步的案例,即第 2 步。
直到现在,我都是手动执行此操作并且浪费了很多时间来 运行 整夜和周末进行模拟。
那么,是否可以使用 bash 脚本编辑文本文件?
示例:
我的文件结构:
试运行
文件夹1
-- TextFile1
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"是你要修改的文件名
我想运行 CFD 模拟分为两个步骤。第一步结束后,我需要更改一个文本文件(与边界条件相关 - CFD 术语)并重新 运行 进一步的案例,即第 2 步。
直到现在,我都是手动执行此操作并且浪费了很多时间来 运行 整夜和周末进行模拟。
那么,是否可以使用 bash 脚本编辑文本文件?
示例: 我的文件结构:
试运行
文件夹1
-- TextFile1
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"是你要修改的文件名