Текст, содержащий специальные символы в командной строке, плохо читается - PullRequest
0 голосов
/ 30 марта 2020

У меня есть функция analyze_text: string -> unit для анализа текста. В результате (в большинстве случаев) ./analyze aText запускает функцию с аргументом.

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

Однако я понимаю, что когда текст содержит специальные символы, такие как ", ' или !, это не может быть хорошо прочитано. Кто-нибудь знает, есть ли способ хорошо обернуть текст и передать его функции?

Ответы [ 2 ]

1 голос
/ 30 марта 2020

В вашем случае виновником является не ваш код OCaml, а поведение вашей оболочки, например, bash. При вводе текста в командной строке bash многие символы имеют особое значение, например, ", ', $, \ и т. Д. Чтобы обозначить sh специальное значение символа в bash, вы можете либо экранировать его с помощью обратного знака sh, например, \$, \\, \', либо разделить одинарными кавычками (но вы все равно необходимо избегать одинарных кавычек в тексте, разделенном одинарными кавычками.

Общий подход заключается в том, что когда ваш ввод представляет собой фактический текст или данные, а не последовательность команд и опций, вы должны читать ввод из файла или из стандартного входного канала. Это также помогает, когда размер ввода велик, так как большинство оболочек ограничивают (иногда значительно) общее количество символов, которое может быть передано через командную строку. В ванильном 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

Тогда вам не нужно иметь дело с какими-либо специальными символами, так как ваш ввод будет файлом, и никакая оболочка между ними не будет интерпретации. Вы даже можете анализировать двоичные данные с этим.

1 голос
/ 30 марта 2020

На оболочке есть много символов оболочки. Вы можете избежать символов оболочки, заключив ваш ввод в одинарные кавычки.

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

Если ваш ввод сам содержит одинарные кавычки. Вам придется заключить это в двойные кавычки и объединить с остальными подстроками ввода, заключенными в одинарные кавычки.

Например, вы хотите напечатать: He $ l! O Wo $ r'ld You может сделать это как:

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