繁体   English   中英

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

[英]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 字符。

$ 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 中隐藏字符的特殊含义,您可以使用反斜杠对其进行转义,例如, \\$\\\\\\'或用单引号分隔(但您仍然需要在单引号分隔的文本中转义单引号。

一般方法是,当您的输入是实际文本或数据,而不是一系列命令和选项时,您应该从文件或标准输入通道读取输入。 当输入的大小很大时,这也有帮助,因为大多数 shell 限制(有时显着)可以通过命令行传递的字符总数。 在 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 会做任何解释。 你甚至可以用它来分析二进制数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM