【问题标题】:Looking for Help Understanding sed commands in os.system() Python lines寻求帮助 理解 os.system() Python 行中的 sed 命令
【发布时间】:2013-09-01 02:49:05
【问题描述】:

我正在将我编写的一些代码翻译成一个并行进程,以便分发到我家乡大学的计算机集群上。为了准备为集群编写脚本,我首先阅读了集群提供的 Python 代码示例 sn-ps 之一:

#! /usr/bin/python

# This script replicates a given test with varied parameters
# creating unique submit scripts and executing the submission to the CRC SGE queue

# Imports
import os
import shutil
import string

basedir=os.getcwd()
origTestFol='wwd'
templFol='template'
origTestDir= basedir + '/' + origTestFol
templFolDir= basedir + '/' + templFol

steps=[0,1,2,3,4,5,6,7,8,9]
primes=[2,3,5,7,11,13,17,19,23,29,31]
trials=[6,7,8,9,10]

for step in steps:
    newTestDir= origTestDir + '_nm_' + str(step)
    if not os.path.exists(newTestDir):
        os.mkdir(newTestDir)
    os.chdir(newTestDir)
    for trial in trials:
       newTestSubDir= newTestDir + '/' + str(trial)
       if not os.path.exists(newTestSubDir):
            shutil.copytree(templFolDir,newTestSubDir)
            os.chdir(newTestSubDir)   
            os.system('sed -i \'s/seedvalue/' + str(primes[trial]) + '/g\' wwd.nm.conf')
            os.system('sed -i \'s/stepval/' + str(step) + '/g\' qsubScript.sh')
            os.system('qsub qsubScript.sh')
            os.chdir(basedir)

我可以按照代码直到最后四行 [e.g.直到 "os.system('sed -i ...)"] 但随后很难遵循代码。有没有其他人可以帮助我理解最后四行在做什么。有没有办法用伪代码来描述谎言?据我所知,第一行 sed 试图用 primes[trial] 的值替换“种子值”,但我不确定种子值是什么。我也不确定如何理解下一行中的“stepval”。任何其他人可以对这些问题提出的任何启发都将不胜感激。

【问题讨论】:

    标签: python sed os.system


    【解决方案1】:

    你可以在 sed 上搜索一下:http://en.wikipedia.org/wiki/Sed#In-place_editing

    简而言之:sed -i 's/old/new/g' filefile 中所有出现的 old 替换为 new-i 标志告诉它内联,修改文件本身。

    在您的代码中,seedvaluestepval 只是文本文件 wwd.nm.confqsubScript.sh 中的两个词。就像您在文本编辑器或文字处理器中所做的那样,这些命令正在替换这些单词。

    【讨论】:

    • 感谢@emnoor 对 s/ 命令和 -i 标志的简洁定义。这个简单的解释帮助我掌握了最后四行代码的作用。
    【解决方案2】:

    seedvalue是一个字符串,所以它的值就是它自己,和stepval一样。

    第一行sed 将用值str(primes[trial]) 替换wwd.nm.conf 中的所有seedvalue 字符串(在所有行上,这就是/g 所做的,它代表“全局”)。这样想:

    在文件 wwd.nm.conf 中找到文本 stepvalue 的任何位置,输入值 str(primes[trial])(无论在 Python 中计算为什么)。

    第二个sed 调用将执行类似的操作,但使用stepvalstep 的结果,它将替换文件qsubScript.sh 中的文本。

    【讨论】:

    • 非常感谢,@Phillip!我确信 seedvalue 和 stepval 是字符串,但是因为代码没有定义这些字符串而感到困惑。我现在才意识到代码将这些保留为未定义的变量,以便用户可以用他们希望在“wwd.nm.conf”脚本中更改的某些代码行替换“seedvalue”。如果我理解正确,上面脚本的要点是稍微修改单个脚本及其关联的 .job 文件,然后提交新的作业文件(使用 qsub)以运行修改后的脚本。感谢您帮助我掌握这一点。
    猜你喜欢
    • 1970-01-01
    • 2021-03-02
    • 2015-11-04
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多