如何让 Octave 更改输入文件中的变量?
How can I get Octave to change the variables in my input files?
我正在尝试让 Octave 更改输入文件中的变量,就像我在 Ubuntu 中使用命令行一样。我已将其剥离回一个简单的案例,我将其更改为字符串 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 时犯了语法错误,但我看不到它。
导致此错误消息的原因是什么?为什么我没有看到预期的输出?
我不知道你为什么会收到这个错误,但我 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/;
作为其命令之一。
但我在 Octave 的 Variables, Manipulating Strings, Strings 或其他地方找不到对此类功能的任何引用。这些字符将被视为文字字符。所以,sed
将得到 s~1000~${Naer_str}~;
作为参数,这意味着它将产生一个垃圾脚本。看起来你在八度音程中做这种事情的方式是使用 printf 风格的格式(如整个操作字符串页面所述)。
看起来您所拥有的只是一个带有计算命令的 system
调用。您已经可以将计算结果作为 system()
的参数传递,不需要也不应在此处使用 eval()
。
八度拼接字符串(字符数组)的方式就是横向矩阵拼接。因此,您可以编写 ['s~1111~' Naer_str]
而不是 's~1111~${Naer_str}~'
(正如 abarnert 指出的那样,由没有八度变量概念的 shell 进行插值),八度将连接起来。
您不需要通过 system()
到达 sed
之外的八度音程来进行文本替换。 strrep
和 regexprep
可以在八度音程(或 Matlab)内对字符数组进行替换。
我正在尝试让 Octave 更改输入文件中的变量,就像我在 Ubuntu 中使用命令行一样。我已将其剥离回一个简单的案例,我将其更改为字符串 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 时犯了语法错误,但我看不到它。
导致此错误消息的原因是什么?为什么我没有看到预期的输出?
我不知道你为什么会收到这个错误,但我 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/;
作为其命令之一。
但我在 Octave 的 Variables, Manipulating Strings, Strings 或其他地方找不到对此类功能的任何引用。这些字符将被视为文字字符。所以,sed
将得到 s~1000~${Naer_str}~;
作为参数,这意味着它将产生一个垃圾脚本。看起来你在八度音程中做这种事情的方式是使用 printf 风格的格式(如整个操作字符串页面所述)。
看起来您所拥有的只是一个带有计算命令的
system
调用。您已经可以将计算结果作为system()
的参数传递,不需要也不应在此处使用eval()
。八度拼接字符串(字符数组)的方式就是横向矩阵拼接。因此,您可以编写
['s~1111~' Naer_str]
而不是's~1111~${Naer_str}~'
(正如 abarnert 指出的那样,由没有八度变量概念的 shell 进行插值),八度将连接起来。您不需要通过
system()
到达sed
之外的八度音程来进行文本替换。strrep
和regexprep
可以在八度音程(或 Matlab)内对字符数组进行替换。