命令行中包含特殊字符的文本无法很好地阅读
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 不会做任何解释。你甚至可以用它来分析二进制数据。
我有一个函数 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 不会做任何解释。你甚至可以用它来分析二进制数据。