将文本导入ruby脚本的最可靠方法

时间:2013-11-20 01:05:23

标签: ruby arguments argument-passing

我有一个ruby脚本,可以进行一些文本解析(àlámarkdown)。它是按照一系列步骤完成的,比如

string = string.gsub # more code here
string = string.gsub # more code here
# and so on

首先将文字输入string的最佳(即最可靠)方法是什么?这是一个脚本,它将被输入的文本可能会有很大差异 - 它可能是多语言的,有一些字符可能会破坏shell(如"'&$您明白了这一点,并且很可能是多线的。

是否有一些技巧
cat << EOF
bunch of text here
EOF

其他注意事项

我不是在寻找降价解析器,这是我想做的事情,而不是我想要的工具。

我不是一个很大的ruby用户(我开始使用它),所以你提供的答案越详细越好。

它必须是完全可编写脚本的(即,不要中断询问用户的信息)。

3 个答案:

答案 0 :(得分:1)

Kernel#gets方法将读取使用stdin中的记录分隔符或命令行中指定的文件分隔的字符串。因此,如果您使用它,您可以执行以下操作:

yourscript <filename #read from filename
yourscript file1 file2 # read both file1 and file2
yourscript  #lets you type at your script

所以运行类似:

cat <<'eof' |ruby yourscript.rb
This' & will $all 'eof' be 'fine'''
eof

脚本可能包含以下内容:

s = gets() # read a line
lines = readlines() # read all lines into an array

这是命令行脚本的标准。如果你想拥有一个用户界面,那么你会想要更复杂的东西。 Ruby解释器有一个选项可以在读取文件时设置文件的编码。

答案 1 :(得分:1)

来自stdin(read对象)的IO

$stdin.read

如您所见,stdin在全局变量$stdin中提供。由于它是IO对象,如果read不符合您的需求,则会a lot of other methods available

这是shell中一个简单的单行示例:

$ echo "foo\nbar" | ruby -e 'puts $stdin.read.upcase'
FOO
BAR

显然,从stdin读取非常灵活,因为你可以从任何地方输入输入。

答案 2 :(得分:0)

Ruby非常擅长编码(参见例如Encoding docs)。要将文本导入Ruby,通常使用gets或读取File个对象,或使用GUI,可以使用gtk2 gem或rugui构建GUI(如果已经完成)。如果您从野外互联网获取文本,安全性应该是您的关注点。 Ruby曾经有4个$SAFE级别,但经过一些讨论后,现在可能只有3个级别。在任何情况下,处理字符串的最佳策略是尽可能多地了解您预期的字符串属性。处理绝对任意的字符串是一项非常困难的任务。尝试限制可能的编码数量,并计算出您期望的字符串的最大大小。

另外,关于你原定的目标,写一个像降价处理器一样的东西,你可能想要不重新发明轮子(除非是出于教学目的)。有这个SO帖子: Better ruby markdown interpreter?

答案会引导你到kramdown宝石,虽然我没有亲自尝试过,但它得到了很多赞誉。