我试图让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以来,我已经看过很多,但我仍然没有真正理解它的含义)。
error: invalid use of script in index expression
我尝试过将内容输入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发出语法错误,但我看不到它。
导致此错误消息的原因是什么?为什么我没有看到我预期的输出?
答案 0 :(得分:8)
我不知道你为什么特别得到这个错误,但我90%肯定这不会做你想要的:
eval(['system(''sed -e "s~1111~${Naer_str}~; s~2222~${sigma_str}~;" OctaveChangeVarTestFile.IN > OctaveChangeVarTestFile_out.IN'');']);
在bash中,双引号字符串中的${Naer_str}
为variable substitution:它在传递之前将${Naer_str}
替换为字符串中Naer_str
变量的值它跟命令一样。因此,sed
将s/1111/1000/;
作为其命令之一。
但我在八度音阶Variables,Manipulating Strings,Strings或其他地方找不到对此类功能的引用。这些字符只会被视为文字字符。因此,sed
将s~1000~${Naer_str}~;
作为参数,这意味着它将生成垃圾脚本。看起来像你在八度音程中做这种事情的方式是使用printf样式的格式化(如操作字符串页面所描述的那样)。
答案 1 :(得分:3)
看起来你所拥有的只是一个带有计算命令的system
调用。您可以将计算结果作为system()
的参数传递,您不需要,也不应在此使用eval()
。
以八度为单位连接字符串(字符数组)的方法只是水平矩阵连接。因此,代替's~1111~${Naer_str}~'
(由abarnert指出,由没有八度变量概念的shell进行插值),您可以编写['s~1111~' Naer_str]
并且八度音将连接。
您无需通过sed
通过system()
到达外部八度音程以进行文字替换。 strrep
和regexprep
可以在八度音程(或Matlab)内的字符数组上进行替换。