我正在寻找与Windows CommandLineToArgvW等效的功能。
我有一个字符串,我希望以bash的方式完全分解所有的角落情况 - 即考虑单引号和双引号,反斜杠等,所以分裂a b "c'd" "\"e\"f" "g\\" h 'i"j'
会导致:
a
b
c'd
"e"f
g\
h
i"j
由于这样的功能已经存在并被OS / bash使用,我假设有一种方法可以调用它,或者至少得到它的源代码,所以我不需要重新发明轮子。
修改
要回答我需要它的原因,它与产生子进程无关。我想创建一个搜索文本的程序,观察多个正则表达式是否为真。但是所有正则表达式都将在同一文本字段中输入,因此我需要将它们分解。
答案 0 :(得分:3)
GNU / Linux由free software和bash组成,是免费软件,因此您可以获取源代码并对其进行改进(并且您应该根据GPL许可证发布改进的补丁)。
但是没有公共库这样做,因为shell的作用是将命令行扩展为execve(2)系统调用的参数(然后转到调用程序的main
)。
(这在MS-DOS中是不同的,被调用的程序必须扩展其命令行)
函数wordexp(3)接近你想要的。
您可能想要研究更简单的shell的源代码,例如下载sash-3.7.tar.gz
答案 1 :(得分:2)
如果您希望它完全按照Bash的方式扩展字符串,则需要运行Bash。请记住,Bash执行参数扩展,命令替换等。如果它真的需要像Bash一样行动,那就打电话给Bash吧。
FILE *f = popen("bash", "r+");
fprintf(f, "echo %s", your_string);
fgets(buffer, sizeof(buffer), f);
pclose(f);
请注意,如果原始代码不够大,实际代码需要处理错误并可能分配更大的缓冲区。
鉴于您的更新要求,听起来您不想像Bash那样完全解析它。相反,您只想用引号和转义来解析空格分隔的字符串。我建议你自己动手实施;我不知道任何现成的库将完全按照您指定的方式解析字符串。你不必完全用手写它;为此,您可以使用flex或Ragel等词汇扫描程序生成器。