gpt4 book ai didi

bash - 使用 Matlab 中的 shell 命令

转载 作者:行者123 更新时间:2023-12-04 18:35:29 25 4
gpt4 key购买 nike

我使用 Matlab 代码并希望在行之间插入 Bash 命令以选择特定文件。

du --max-depth 1 |
awk -v q='"' '$1 < 30000000 && $2 != "." {sub(/^[0-9\t ]+/, "", $0); print q $0 q}'

该命令在 shell 中运行良好,但我很困惑如何在 Matlab 代码行之间使用它。

最佳答案

linux下,systemunix做同样的事情:他们在 shell 中评估他们的字符串参数。为此,由于 MATLAB 的字符串语法,您必须转义单引号,您可以通过将每个单引号加倍来做到这一点:

[~,output]=system('du --max-depth 1 | awk -v q=''"'' ''$1 < 30000000 && $2 != "." {sub(/^[0-9\t ]+/, "", $0); print q $0 q}''');

这会将命令的输出保存到名为 output 的字符串中。 .第一个输出参数是状态码。虽然,根据后续应用程序,您可能希望完全从输出中删除双引号(即,省略变量 q 并只在末尾添加 print $0)。

由于您的 output现在是一个字符向量,换行符被简单地包含为 \n字符,您必须进行一些后处理才能获得有意义的文件名。最简单的方法是使用 regexp在换行符处拆分您的字符串,然后由于字符串末尾的最后一个换行符而记住丢弃最后一个(空)字符串。如果您听从我关于双引号的建议,请执行以下操作:
[~,output] = system('du --max-depth 1 | awk ''$1 < 30000000 && $2 != "." {sub(/^[0-9\t ]+/, "", $0); print $0}''');
filelist = regexp(output,'\n','split'); %split at newline
filelist = filelist(1:end-1); %throw away the last dubious part

现在 filelist是一个元胞数组,每个元素都包含一个字符串:脚本输出的每个对象的名称。

但要小心:通常从命令窗口输入会导致输入到 system 的乱码。调用,就像来自 STDIN 一样。见 this important post .原则上,您可以通过将系统命令的 STDIN 重定向到 /dev/null 来解决部分问题。 ,如 du --max-depth 1 </dev/null | awk ... ,但我发现这不是一个通用的解决方案。

关于bash - 使用 Matlab 中的 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32285715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com