如何让Octave更改输入文件中的变量?

Rel*_*ser 12 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~${Naer_str}~; s~2222~${sigma_str}~;" OctaveChangeVarTestFile.IN > OctaveChangeVarTestFile_out.IN'');']);
Run Code Online (Sandbox Code Playgroud)

制作新的输入文件,但不是看到值1000和0.491,因为我预期0.491和1000应该是空白的地方.在调试模式下运行它显示了以下错误消息(自从我几天前开始使用Octave以来,我已经看过很多,但我仍然没有真正理解它的含义).

 error: invalid use of script in index expression
Run Code Online (Sandbox Code Playgroud)

我试过把东西输入Linux终端,如下所示:

 Naer_str=1000
sigma_Str=0.491
 sed -e "s/1111/${Naer_str}/; s/2222/${sigma_str}/;" OctaveChangeVarTestFile.IN > OctaveChangeVarTestFile_out.IN
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,所以我假设我必须使用system或eval发出语法错误,但我看不到它.

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

aba*_*ert 8

我不知道你为什么特别得到这个错误,但我90%肯定这不会做你想要的:

eval(['system(''sed -e "s~1111~${Naer_str}~; s~2222~${sigma_str}~;" OctaveChangeVarTestFile.IN > OctaveChangeVarTestFile_out.IN'');']);
Run Code Online (Sandbox Code Playgroud)

在bash中,${Naer_str}双引号字符串内部是一个变量替换:它将字符串中的变量${Naer_str}值替换为该Naer_str变量,然后将其传递给命令.因此,seds/1111/1000/;作为其命令之一.

但我在八度音程的变量,操纵字符串,字符串或其他地方找不到任何对此类功能的引用.这些字符只会被视为文字字符.因此,sed将得到s~1000~${Naer_str}~;一个参数,这意味着它将产生一个垃圾脚本.看起来你在八度音程中做这种事情的方式是使用printf风格的格式化(如操作字符串页面所描述的那样).


Ben*_*igt 3

  1. 看起来您所拥有的只是一个system带有计算命令的调用。您已经可以将计算结果作为参数传递system(),但您不需要也不应该eval()在此处使用。

  2. 八度连接字符串(字符数组)的方式就是水平矩阵连接。因此,'s~1111~${Naer_str}~'您可以编写并连接八度音程(正如 abarnert 指出的那样,由没有八度变量概念的 shell 进行插值)['s~1111~' Naer_str]

  3. 您无需到达外部八度sed音程system()即可进行文本替换。 strrep并且regexprep可以在八度音程(或Matlab)内对字符数组进行替换。