【问题标题】:Using sed -i to run consecutive command使用 sed -i 运行连续命令
【发布时间】:2021-01-10 13:53:44
【问题描述】:

我有一个 sh 文件(名为 a.sh),我使用命令 sbatch 为我的项目处理它,所以我输入了很多:

sbatch a.sh

a.sh 有 2 条关键行(我猜其余的都无关紧要)。他们是

来源/okyanus/progs/gaussian/g16/bsd/g16.sariyer.profile

g16 dtn-b3-0-0.gjf

第二个在文件的末尾(后面会提到aaa.com),它是需要改变的。并且 aaa.com 应该和 a.sh 在同一目录下才能提交作业 aaa.com。

a.sh 文件中,有一个文件名(比如说aaa.com),该文件的数据用于sbatch 进程。所以我要做的一个标准操作让我们说接下来的 4 个工作是:

  1. 修改a.sh文件以更改寻址文件的名称(例如将aaa.com更改为aab.com),写入并退出
  2. 输入:sbatch a.sh(开始操作)
  3. 修改a.sh文件以更改寻址文件的名称(例如将aab.com更改为aac.com),写入并退出
  4. 输入:sbatch a.sh(开始操作)
  5. 修改a.sh文件以更改寻址文件的名称(例如将aac.com更改为aad.com),写入并退出
  6. 输入:sbatch a.sh(开始操作)
  7. 修改a.sh文件以更改寻址文件的名称(例如将aad.com更改为aae.com),写入并退出
  8. 输入:sbatch a.sh(开始操作)

但是,我曾经有一个带有sed -i 的命令模板。该命令可以一次完成这 8 项操作。从我的旧笔记中,我可以找到旧模板的某些部分。

我的旧模板是一个简短的版本,但可以有效地使用以下命令一步执行前两个操作:

sed -i 's/aaa.com/aab.com/g' a.sh ; sbatch a.sh

上面的命令同时执行第一步和第二步。我知道我使用了一个可以同时执行所有 8 个步骤的命令。我是这样的:

sed -i 's/aaa.com/aab.com???aab.com/aac.com???aac.com/aad.com???aad.com/aae.com/g' a.sh ; sbatch a.sh

上述命令可以一次完成所有 8 个步骤,提交接下来的 4 个作业。但是,我不记得应该写什么了???成功执行命令的部件。

我确信我建议的命令在其正确状态下工作。任何其他想法和帮助将不胜感激。

P.S.:a.sh 文件是系统生成的。它获取与化学相关的程序,然后将 .com(或 .gjf)文件的值提交给它运行的化学程序。

谢谢!

【问题讨论】:

  • 你可以使用例如for 循环。是否可以选择更改脚本a.sh 以将文件作为命令行参数进行处理?然后您可以将其称为a.sh aaa.com 等,也可以使用for f in aaa aab aac ; do sbatch a.sh ${f}.com ; done 如果您愿意edit 您的问题并在a.sh 中显示代码,那么提供更好的建议或完整答案会更容易。
  • 如果由于某种原因无法更改a.sh,则将a.sh 更改为b.sh 并编辑b.sh。不断修改脚本是荒谬的。请改用参数。
  • 如果您使用的sbatch 是接受--input 指令以读取批处理脚本的标准输入的那个,如果从sbatch 传递参数很困难,也许您想做sed ... a.sh | sbatch --input
  • 更改 a.sh 文件是一个选项。事实上,如果我们没有捷径,它是一种选择。我必须修改它可能 10 次,并在每次修改后编写 sbatch a.sh 命令。这里的想法是一步到位。我试图通过一步完成 20 次操作来赢得时间。为什么这是荒谬的?
  • 处理状态总是很困难的。而是考虑编写一个模板文件和一个带参数的数组,而不是 修改 a.sh 文件,重新创建整个文件 - 更少的状态,更少的问题。

标签: linux ubuntu sed


【解决方案1】:

应该写什么???成功执行命令的部件

ss/<regex>/<replacement>/<flags> 是替代命令。

sed 中的默认和最终命令分隔符是 换行符。如果可能,您可以选择使用; 分隔命令。所以它看起来像:

sed 's/regex/replacement/; s/regex2/replacement2/; : another_command ; b another_command'

我是这样的: sed -i 's/aaa.com/aab.com???aab.com/aac.com???aac.com/aad.com???aad.com/aae.com/g'

在做:

sed 's/aaa.com/aab.com/; s/aab.com/aac.com/;`

没有意义,首先将aaa 替换为aab,然后将aab 替换为aac。同理:

sed 's/aaa.com/aac.com/;`

你可以从后面做:

sed 's/aab.com/aac.com/; s/aaa.com/aab.com/;'

但真正省去处理一些不确定状态和创建模板文件的麻烦:

# template.a.sh
work on UNIQUE_STRING

然后迭代值并替换每次重新创建整个文件,这样您就不必关心文件中的“曾经”和文件中的“将是”。只需从模板创建文件:

for i in aaa.com aab.com aac.com; do
    sed 's/UNIQUE_STRING/'"$i"'/' template.a.sh > a.sh
    sbatch a.sh
done

【讨论】:

  • 是的,确实是 sed 's/aaa.com/aab.com/; s/aab.com/aac.com/ 没有意义。因为 sbatch a.sh 命令应该放在每次更改之后。 3 个工作的正确行是: sed -i 's/previous.com/first.com/g' a.sh ;批量 a.sh ; sed -i 's/first.com/second.gjf/g' a.sh ;批量 a.sh ; sed -i 's/second.gjf/third.com/g' a.sh ; sbatch a.sh.但是,使用 for 命令的解决方案更好。我创建了一个 temp.a.sh 文件,但不知道如何修改它以使用您建议的“for”命令。我想它不会像你写的那样工作。你想让我把 temp.a.sh 文件发给你吗?
  • I guess it wont work just the way you write. ?为什么repl.it/@kamilcukrowski/SillyViolentBlock#main.sh
  • 我不太确定。你能检查一下吗? repl.it/@Beko2/SillyViolentBlock#my.sh
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多