命令行中包含特殊字符的文本无法很好地阅读

Text containing special characters in command line cannot be well read

我有一个函数 analyze_text: string -> unit 可以分析文本。结果,(大多数情况下)./analyze aText 使用参数启动函数。

let usage_msg = "./analyze [options] TEXT" in
Arg.parse options analyze_text usage_msg;

但是,我发现当文本中包含"'!等特殊字符时,无法很好地阅读。有谁知道有没有办法很好地包装文本并将其提供给函数?

shell 上有很多 shell 个字符。您可以通过将输入用单引号括起来来转义 shell 个字符。

$ echo 'a*$b"$c"!d'
a*$b"$c"!d

如果您的输入本身包含单引号。您必须将其括在双引号中,并与输入的其余子字符串连接起来,这些子字符串括在单引号中。

例如你想打印:He$l!o Wo$r'ld 你可以这样做:

$ echo 'He$l!o Wo$r'"'"'ld'
He$l!o Wo$r'ld

在您的情况下,罪魁祸首不是您的 OCaml 代码,而是您 shell 的行为,例如 bash。当您在 bash 命令行提示符中输入文本时,许多字符具有特殊含义,例如 "'$\ 等。要隐藏 bash 中字符的特殊含义,您可以使用反斜杠将其转义,例如 $\\' 或使用单引号分隔(但您仍然需要在单引号分隔的文本中转义单引号。

一般方法是,当您的输入是实际文本或数据,而不是一系列命令和选项时,您应该从文件或标准输入通道读取输入。当输入的大小时,这也有帮助,因为大多数 shells 限制(有时是显着)可以通过命令行传递的字符总数。在 vanilla OCaml 中,您可以使用以下简单代码将整个文件输入到单个字符串中

let read_file filename =
  let buf = Buffer.create 4096 in
  let chan = open_in filename in
  begin
    try while true do Buffer.add_channel buf chan 4096 done
    with End_of_file -> ()
  end;
  Buffer.contents buf

那么你不需要处理任何特殊字符,因为你的输入将是文件,中间的 shell 不会做任何解释。你甚至可以用它来分析二进制数据。