我试图让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发出语法错误,但我看不到它.
是什么导致此错误消息?为什么我没有看到我预期的输出?
我不知道你为什么特别得到这个错误,但我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变量,然后将其传递给命令.因此,sed将s/1111/1000/;作为其命令之一.
但我在八度音程的变量,操纵字符串,字符串或其他地方找不到任何对此类功能的引用.这些字符只会被视为文字字符.因此,sed将得到s~1000~${Naer_str}~;一个参数,这意味着它将产生一个垃圾脚本.看起来你在八度音程中做这种事情的方式是使用printf风格的格式化(如操作字符串页面所描述的那样).
看起来您所拥有的只是一个system带有计算命令的调用。您已经可以将计算结果作为参数传递system(),但您不需要也不应该eval()在此处使用。
八度连接字符串(字符数组)的方式就是水平矩阵连接。因此,'s~1111~${Naer_str}~'您可以编写并连接八度音程(正如 abarnert 指出的那样,由没有八度变量概念的 shell 进行插值)['s~1111~' Naer_str]。
您无需到达外部八度sed音程system()即可进行文本替换。 strrep并且regexprep可以在八度音程(或Matlab)内对字符数组进行替换。