Sed 如何让倍频程更改输入文件中的变量?

Sed 如何让倍频程更改输入文件中的变量?,sed,octave,Sed,Octave,我试图让Octave改变输入文件中的变量,就像我在Ubuntu中使用命令行一样。我把它剥离到一个简单的例子中,我让它将'1111'改为字符串Naer_str,将'2222'改为字符串sigma_str;将结果打印到新文件。1111和2222都出现在第一个文件中。下面是我正在运行的全部代码 Naer_str= num2str(1000) disp(Naer_str) sigma_str = num2str(0.491) eval(['system(''sed -e "s~1111~$

我试图让Octave改变输入文件中的变量,就像我在Ubuntu中使用命令行一样。我把它剥离到一个简单的例子中,我让它将'1111'改为字符串Naer_str,将'2222'改为字符串sigma_str;将结果打印到新文件。1111和2222都出现在第一个文件中。下面是我正在运行的全部代码

 Naer_str= num2str(1000)

 disp(Naer_str)

 sigma_str = num2str(0.491)

 eval(['system(''sed -e "s~1111~${Naer_str}~; s~2222~${sigma_str}~;" OctaveChangeVarTestFile.IN > OctaveChangeVarTestFile_out.IN'');']);
创建了新的输入文件,但没有像我预期的那样看到值1000和0.491,0.491和1000应该为空的位置。在调试模式下运行它会显示以下错误消息(自从几天前开始使用Octave以来,我已经看到了很多,但我仍然没有真正理解它的含义)

我尝试过将内容输入Linux终端,如下所示:

 Naer_str=1000
sigma_Str=0.491
 sed -e "s/1111/${Naer_str}/; s/2222/${sigma_str}/;" OctaveChangeVarTestFile.IN > OctaveChangeVarTestFile_out.IN
这看起来很好,所以我假设我一定是在使用system或eval时犯了语法错误,但我看不出来


导致此错误消息的原因是什么?为什么我看不到预期的输出?

我不知道您为什么会出现此错误,但我90%确定这不会满足您的要求:

eval(['system(''sed -e "s~1111~${Naer_str}~; s~2222~${sigma_str}~;" OctaveChangeVarTestFile.IN > OctaveChangeVarTestFile_out.IN'');']);
在bash中,双引号字符串中的
${Naer\u str}
是一个:它将
${Naer\u str}
替换为字符串中
Naer\u str
变量的值,然后将其传递给命令。因此,
sed
将获得
s/1111/1000/
作为其命令之一

但我在八度音阶的、、或其他地方找不到这样一个特征的参考。这些字符将被视为文字字符。因此,
sed
将获得
s~1000${Naer_str}~
作为参数,这意味着它将生成一个垃圾脚本。看起来,在八度音阶中执行此类操作的方法是使用printf样式的格式(如操作字符串页面中所述)

  • 看起来您只有一个
    系统
    调用和一个计算命令。您可以将计算结果作为
    system()
    的参数传递,您不需要也不应该在此处使用
    eval()

  • 以八度音阶连接字符串(字符数组)的方法就是水平矩阵连接。因此,您可以编写
    ['s~1111~${Naer_str}}.
    (正如abarnert指出的,它是由没有倍频程变量概念的shell插值的)而不是
    ['s~1111~'Naer_str]
    ,倍频程将连接起来

  • 您不需要通过
    system()
    将八度以外的音阶调到
    sed
    来替换文本
    strep
    regexprep
    可以在倍频程(或Matlab)内的字符数组上进行替换


  • 如果你打算否决这个问题,我可以请你留下评论吗。我真的不知道我做错了什么。这看起来并不是一个编程问题,尽管我不熟悉这些工具。最后一部分是我没有否决这一点或投票以非主题结束的唯一原因。Octave是否真的像bash那样将
    ${…}
    替换为字符串,但即使是在单引号字符串中?如果不是,则根本不是将相同的内容发送到
    sed
    ,而是发送垃圾,垃圾可能只是作为文本字符串。所以你最终尝试评估的是垃圾。同时,我不知道Octave的
    eval
    做了什么,但是
    sed
    调用应该什么也不输出,因为你把它的stdout重定向到一个文件,所以我看不出它有什么有用的东西可以评估。除非
    eval
    是实际运行
    system
    命令本身的方式,而不是根据调用它的结果执行的操作?对吧,那么你认为这是因为使用了美元符号?我认为通过使用eval(['system('INSERTCODEHERE');']);INSERTCODEHERE这一行实际上是在shell中完成的,这不对吗?@不情愿的Linux_用户:是的,这一行是在shell中完成的……但是shell无法访问您在其他程序中创建的变量(除非octave实际将其全局变量存储在进程的
    环境中,我对此表示怀疑).我正在使用此命令编辑八度以外的文件。我对这些建议有点胡思乱想,但无法回避这样一个事实:我需要将内容而不是字符串的名称传递到系统中。使用['s~1111~'Naer_str]。我并不是在试图改变一个文件中超出八度的文本。我看不出你怎么能用strrep或regexprep做到这一点,但也许我只是个傻瓜。无论如何,谢谢你的努力。:)@不情愿的Linux用户:要么(1)将文件读入倍频程,使用
    strrep
    ,然后将其写出来,要么(2)使用
    system
    和字符数组串联
    ['sed-e“s~1111~'Naer_str'~”]
    来构建一个已经包含倍频程变量值的命令字符串。选项1会很混乱,这是一个非常大的文件,但它可能会工作。选项2正是我所尝试的,但没有起作用,但实际上读了你的评论,我已经意识到问题所在,我们都错过了sed声明中的“结束语”(Oysh,应该看到!)@不情愿的Linux用户:我回答中的位不应该是一个完整的
    sed
    命令行,足以说明这是如何将文字和变量粘贴在一起的。@不情愿的Linux用户:顺便说一句,我回答中的第3部分是因为不清楚这些文件最初是来自octave数据,还是来自e在哪里。
    eval(['system(''sed -e "s~1111~${Naer_str}~; s~2222~${sigma_str}~;" OctaveChangeVarTestFile.IN > OctaveChangeVarTestFile_out.IN'');']);